From 4ad0d24c5b3a0afd99722ae5c33968ff9fa44e2d Mon Sep 17 00:00:00 2001
From: Dimitri van Heesch <dimitri@stack.nl>
Date: Wed, 28 Jul 2010 19:05:01 +0000
Subject: Release-1.7.1-20100728

---
 Doxyfile                  |   9 +-
 INSTALL                   |   4 +-
 README                    |   4 +-
 configure                 |   4 +-
 doc/commands.doc          |  24 +++-
 doc/config.doc            |   2 +-
 doc/doxygen_manual.tex    |   3 +-
 doc/install.doc           |   1 +
 doc/language.doc          |   6 +-
 doc/starting.doc          |  16 ++-
 doc/translator_report.txt |  24 +---
 qtools/qstring.cpp        |   9 +-
 qtools/qstring.h          |  16 ++-
 src/classdef.cpp          |  30 +++--
 src/classlist.cpp         |   4 +
 src/code.l                |   5 +-
 src/commentscan.l         |  10 +-
 src/config.l              |   6 +-
 src/config.xml            |  18 +--
 src/configoptions.cpp     |  18 +--
 src/defargs.l             |   2 +-
 src/definition.cpp        |  14 +-
 src/dirdef.cpp            |   6 +-
 src/docsets.cpp           |   5 +-
 src/docsets.h             |   6 +-
 src/doctokenizer.l        |   2 +-
 src/dot.cpp               |  43 ++++++-
 src/dot.h                 |  11 ++
 src/doxygen.cpp           |  21 ++-
 src/doxygen.css           |  12 +-
 src/doxygen_css.h         |  12 +-
 src/eclipsehelp.cpp       |   3 +-
 src/eclipsehelp.h         |   3 +-
 src/ftvhelp.cpp           |   2 +-
 src/ftvhelp.h             |   2 +-
 src/groupdef.cpp          |   2 +-
 src/htmldocvisitor.cpp    |   8 +-
 src/htmlgen.cpp           |  50 +++----
 src/htmlhelp.cpp          |   6 +-
 src/htmlhelp.h            |   3 +-
 src/index.cpp             |  25 ++--
 src/index.h               |  15 ++-
 src/lang_cfg.h            |   2 +
 src/lodepng.h             |   4 +-
 src/memberdef.cpp         |  19 ++-
 src/membergroup.cpp       |   5 +-
 src/pagedef.cpp           |   2 +-
 src/pre.l                 |  65 +++++++++-
 src/pycode.l              |   4 +
 src/pyscanner.l           | 112 +++++++++-------
 src/qhp.cpp               |  15 +--
 src/qhp.h                 |   6 +-
 src/scanner.l             |  50 +++++--
 src/search.js             |   2 +-
 src/search.php            |   2 +-
 src/search_js.h           |   2 +-
 src/search_php.h          |   2 +-
 src/translator_es.h       | 322 +++++++++++++++++++++++-----------------------
 58 files changed, 657 insertions(+), 423 deletions(-)

diff --git a/Doxyfile b/Doxyfile
index def6ede..6c2dbac 100644
--- a/Doxyfile
+++ b/Doxyfile
@@ -42,7 +42,7 @@ SYMBOL_CACHE_SIZE      = 0
 # Build related configuration options
 #---------------------------------------------------------------------------
 EXTRACT_ALL            = YES
-EXTRACT_PRIVATE        = NO
+EXTRACT_PRIVATE        = YES
 EXTRACT_STATIC         = YES
 EXTRACT_LOCAL_CLASSES  = YES
 EXTRACT_LOCAL_METHODS  = NO
@@ -115,7 +115,12 @@ EXCLUDE                = src/code.cpp \
                          src/fortranscanner.cpp \
                          src/fortrancode.cpp \
                          src/vhdlscanner.cpp \
-                         src/vhdlcode.cpp
+                         src/vhdlcode.cpp \
+                         src/doxygen_css.h \
+                         src/doxygen_js.h \
+                         src/doxygen_php.h \
+                         src/compound_xsd.h \
+                         src/layout_default.h \
 EXCLUDE_SYMLINKS       = NO
 EXCLUDE_PATTERNS       =
 EXCLUDE_SYMBOLS        =
diff --git a/INSTALL b/INSTALL
index fae334f..ee08aea 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,7 +1,7 @@
-DOXYGEN Version 1.7.1
+DOXYGEN Version 1.7.1-20100728
 
 Please read the installation section of the manual 
 (http://www.doxygen.org/install.html) for instructions.
 
 --------
-Dimitri van Heesch (25 June 2010)
+Dimitri van Heesch (28 July 2010)
diff --git a/README b/README
index 715c7d5..679c4f0 100644
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-DOXYGEN Version 1.7.1
+DOXYGEN Version 1.7.1_20100728
 
 Please read INSTALL for compilation instructions.
 
@@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives.
 
 Enjoy,
 
-Dimitri van Heesch (dimitri@stack.nl) (25 June 2010)
+Dimitri van Heesch (dimitri@stack.nl) (28 July 2010)
diff --git a/configure b/configure
index 0b0fd75..afb6fa3 100755
--- a/configure
+++ b/configure
@@ -20,7 +20,7 @@ doxygen_version_minor=7
 doxygen_version_revision=1
 
 #NOTE: Setting version_mmn to "NO" will omit mmn info from the package.
-doxygen_version_mmn=NO
+doxygen_version_mmn=20100728
 
 bin_dirs=`echo $PATH | sed -e "s/:/ /g"`
 
@@ -38,7 +38,7 @@ f_app=NO
 f_thread=NO
 f_flex=NO
 f_bison=NO
-f_langs=nl,sv,cz,fr,id,it,de,jp,je,es,fi,ru,hr,pl,pt,hu,kr,ke,ro,si,cn,no,br,dk,sk,ua,gr,tw,sr,ca,lt,za,ar,fa,vi,tr,eo
+f_langs=nl,sv,cz,fr,id,it,de,jp,je,es,fi,ru,hr,pl,pt,hu,kr,ke,ro,si,cn,no,mk,br,dk,sk,ua,gr,tw,sr,ca,lt,za,ar,fa,sc,vi,tr,eo
 
 while test -n "$1";  do
   case $1 in
diff --git a/doc/commands.doc b/doc/commands.doc
index e8cf0a6..ed6f475 100644
--- a/doc/commands.doc
+++ b/doc/commands.doc
@@ -74,6 +74,7 @@ documentation:
 \refitem cmdenddot \\enddot
 \refitem cmdendhtmlonly \\endhtmlonly
 \refitem cmdendif \\endif
+\refitem cmdendinternal \\endinternal
 \refitem cmdendlatexonly \\endlatexonly
 \refitem cmdendlink \\endlink
 \refitem cmdendmanonly \\endmanonly
@@ -381,6 +382,15 @@ Structural indicators
   \sa section \ref cmdinclude "\\include".
 
 <hr>
+\section cmdendinternal \\endinternal
+
+  \addindex \\endinternal
+  This command ends a documentation fragment that was started with a
+  \ref cmdinternal "\\internal" command. The text between \c \\internal and 
+  \c \\endinternal will only be visible 
+  if \ref cfg_internal_docs "INTERNAL_DOCS" is set to YES.
+
+<hr>
 \section cmdextends \\extends <name>
 
   \addindex \\extends
@@ -549,18 +559,18 @@ Structural indicators
 \section cmdinternal \\internal
   
   \addindex \\internal
-  This command writes the message `For internal use only' to the output and
-  all text \e after an \c \\internal command until the end of the
-  comment block or the end of the section (whichever comes first) is 
-  marked as "internal". 
+  This command starts a documentation fragment that is meant for internal
+  use only. The fragment naturally ends at the end of the comment block. 
+  You can also force the internal section to end earlier using the 
+  \ref cmdendinternal "\\endinternal" command.
 
   If the \\internal command is put inside a section 
-  (see for example \ref cmdsection "\\section") all subsection after the 
+  (see for example \ref cmdsection "\\section") all subsections after the 
   command are considered to be internal as well. Only a new section at the 
-  same level will be visible again. 
+  same level will end the fragment that is considered internal.
 
   You can use \ref cfg_internal_docs "INTERNAL_DOCS" in the config file
-  to show or hide the internal documentation.
+  to show (\c YES) or hide (\c NO) the internal documentation.
 
 <hr>
 \section cmdmainpage \\mainpage [(title)]
diff --git a/doc/config.doc b/doc/config.doc
index a4402d1..c2f988e 100644
--- a/doc/config.doc
+++ b/doc/config.doc
@@ -572,7 +572,7 @@ followed by the descriptions of the tags grouped by category.
  Doxygen has a built-in mapping, but you can override or extend it using this tag.
  The format is ext=language, where ext is a file extension, and language is one of
  the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP,
- Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat
+ Objective-C, Python, Fortran, VHDL. For instance to make doxygen treat
  .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran),
  use: inc=Fortran f=C
 
diff --git a/doc/doxygen_manual.tex b/doc/doxygen_manual.tex
index a10cddd..bc79264 100644
--- a/doc/doxygen_manual.tex
+++ b/doc/doxygen_manual.tex
@@ -36,13 +36,14 @@
 \renewcommand{\cftsecindent}{0 em}
 \renewcommand{\cftsecnumwidth}{3.2 em}
 \renewcommand{\cftsubsecindent}{3.2 em}
+\newcommand{\thisyear}{\the\year}
 \begin{document}
 \begin{titlepage}
 \includegraphics[width=\textwidth]{doxygen_logo}
 \begin{center}
 Manual for version $VERSION\\[2ex]
 Written by Dimitri van Heesch\\[2ex]
-\copyright 1997-2007
+\copyright 1997-\thisyear
 \end{center}
 \end{titlepage}
 \clearemptydoublepage
diff --git a/doc/install.doc b/doc/install.doc
index b668dde..b8b8154 100644
--- a/doc/install.doc
+++ b/doc/install.doc
@@ -209,6 +209,7 @@ The solution: go to the root of the doxygen distribution and do:
    cd qt
    ln -s your-qt-include-dir-here include
    ln -s your-qt-lib-dir-here lib
+   ln -s your-qt-bin-dir-here bin
    export QTDIR=$PWD
 \endverbatim 
 
diff --git a/doc/language.doc b/doc/language.doc
index c4c1e10..ec2fc27 100644
--- a/doc/language.doc
+++ b/doc/language.doc
@@ -23,7 +23,7 @@ text fragments, generated by doxygen, can be produced in languages other
 than English (the default). The output language is chosen through the
 configuration file (with default name and known as Doxyfile).
 
-Currently (version 1.6.3), 38 languages 
+Currently (version 1.7.1), 38 languages 
 are supported (sorted alphabetically):
 Afrikaans, Arabic, Brazilian Portuguese, Catalan, Chinese, Chinese
 Traditional, Croatian, Czech, Danish, Dutch, English, Esperanto,
@@ -278,7 +278,7 @@ when the translator was updated.
     <td>Turkish</td>
     <td>Emin Ilker Cetinbas</td>
     <td>niw3 at yahoo dot com</td>
-    <td>1.6.0</td>
+    <td>up-to-date</td>
   </tr>
   <tr bgcolor="#ffffff">
     <td>Ukrainian</td>
@@ -400,7 +400,7 @@ when the translator was updated.
   \hline
   Swedish & Mikael Hallin & {\tt\tiny mikaelhallin at yahoo dot se} & 1.6.0 \\
   \hline
-  Turkish & Emin Ilker Cetinbas & {\tt\tiny niw3 at yahoo dot com} & 1.6.0 \\
+  Turkish & Emin Ilker Cetinbas & {\tt\tiny niw3 at yahoo dot com} & up-to-date \\
   \hline
   Ukrainian & -- searching for the maintainer -- & {\tt\tiny } & 1.4.1 \\
   \hline
diff --git a/doc/starting.doc b/doc/starting.doc
index 8e3e0d2..d90d136 100644
--- a/doc/starting.doc
+++ b/doc/starting.doc
@@ -38,6 +38,17 @@ tries to be complete):
 \image html infoflow.gif "Doxygen information flow" 
 \image latex infoflow.eps "Doxygen information flow" width=14cm
 
+\section step0 Step 0: Check if doxygen supports your programming language
+
+First, assure that your programming language has a reasonable chance of being
+recognized by Doxygen. These languages are supported by default: C, C++, C#,
+Objective-C, IDL, Java, VHDL, PHP, Python, Fortran, and D. It
+is possible to configure certain filetype extensions to use certain parsers:
+see the \ref cfg_extension_mapping "Configuration/ExtensionMappings" for details. 
+Also, completely different languages can be supported by using preprocessor 
+programs: see the <a href="http://www.doxygen.org/helpers.html">Helpers page</a> 
+for details.
+
 \section step1 Step 1: Creating a configuration file
 
 Doxygen uses a configuration file to determine all of its settings.
@@ -163,7 +174,8 @@ require a browser that supports DHTML and Javascript.
 \subsection latex_out LaTeX output
 \addindex LaTeX
 The generated \f$\mbox{\LaTeX}\f$ documentation must first be compiled by 
-a \f$\mbox{\LaTeX}\f$ compiler (I use a recent teTeX distribution). 
+a \f$\mbox{\LaTeX}\f$ compiler (I use a recent teTeX distribution for Linux
+and MacOSX and MikTex for Windows). 
 To simplify the process of compiling the generated
 documentation, \c doxygen writes a \c Makefile into the \c latex directory. 
 
@@ -250,7 +262,7 @@ basically two options:
 </ol>
 Files can only be documented using the second option, since there is
 no way to put a documentation block before a file. Of course, file members 
-(functions, variable, typedefs, defines) do not need an explicit 
+(functions, variables, typedefs, defines) do not need an explicit 
 structural command; just putting a special documentation block in front or 
 behind them will do. 
 
diff --git a/doc/translator_report.txt b/doc/translator_report.txt
index 6d1c243..a79f1da 100644
--- a/doc/translator_report.txt
+++ b/doc/translator_report.txt
@@ -1,4 +1,4 @@
-(1.6.3)
+(1.7.1)
 
 Doxygen supports the following 38 languages (sorted alphabetically):
 
@@ -10,7 +10,7 @@ Persian, Polish, Portuguese, Romanian, Russian, Serbian,
 SerbianCyrilic, Slovak, Slovene, Spanish, Swedish, Turkish, Ukrainian,
 and Vietnamese.
 
-Of them, 9 translators are up-to-date, 29 translators are based on
+Of them, 10 translators are up-to-date, 28 translators are based on
 some adapter class, and 2 are English based.
 
 ----------------------------------------------------------------------
@@ -28,6 +28,7 @@ still may be some details listed even for them:
   TranslatorPersian -- The MAX_DOT_GRAPH_HEIGHT found in trLegendDocs()
   TranslatorSlovak
   TranslatorSpanish -- The MAX_DOT_GRAPH_HEIGHT found in trLegendDocs()
+  TranslatorTurkish
 
 ----------------------------------------------------------------------
 The following translator classes need some maintenance (the most
@@ -46,7 +47,6 @@ must be implemented to become up-to-date:
   TranslatorEsperanto             1.6.3 	 4 methods to implement (1 %)
   TranslatorCatalan               1.6.3 	 4 methods to implement (1 %)
   TranslatorVietnamese            1.6.0 	 9 methods to implement (4 %)
-  TranslatorTurkish               1.6.0 	 9 methods to implement (4 %)
   TranslatorSwedish               1.6.0 	 9 methods to implement (4 %)
 	Note: Reimplementation using UTF-8 suggested.
 
@@ -878,24 +878,6 @@ TranslatorSwedish   (TranslatorAdapter_1_6_0)  9 methods to implement (4 %)
     virtual QCString trIncludesFileIn(const char * name)
 
 
-TranslatorTurkish   (TranslatorAdapter_1_6_0)  9 methods to implement (4 %)
------------------
-
-  Implements 216 of the required methods (96 %).
-
-  Missing methods (should be implemented):
-
-    virtual QCString trSearching()
-    virtual QCString trNoMatches()
-    virtual QCString trLoading()
-    virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
-    virtual QCString trFileIn(const char * name)
-    virtual QCString trGlobalNamespace()
-    virtual QCString trDirRelation(const char * name)
-    virtual QCString trDirDependency(const char * name)
-    virtual QCString trIncludesFileIn(const char * name)
-
-
 TranslatorUkrainian   (TranslatorAdapter_1_4_1)  33 methods to implement (14 %)
 -------------------
 
diff --git a/qtools/qstring.cpp b/qtools/qstring.cpp
index 5d50060..bc3dfc7 100644
--- a/qtools/qstring.cpp
+++ b/qtools/qstring.cpp
@@ -12170,13 +12170,20 @@ QString QString::fromUcs2( const unsigned short *str )
 */
 
 Q_EXPORT QStringData *QString::shared_null = 0;
-QT_STATIC_CONST_IMPL QString QString::null;
+//QT_STATIC_CONST_IMPL QString QString::null;
 QT_STATIC_CONST_IMPL QChar QChar::null;
 QT_STATIC_CONST_IMPL QChar QChar::replacement((ushort)0xfffd);
 QT_STATIC_CONST_IMPL QChar QChar::byteOrderMark((ushort)0xfeff);
 QT_STATIC_CONST_IMPL QChar QChar::byteOrderSwapped((ushort)0xfffe);
 QT_STATIC_CONST_IMPL QChar QChar::nbsp((ushort)0x00a0);
 
+#if defined(_CC_MSVC_) && _MSC_VER <= 1300
+const QString::Null QString::null;
+#else
+const QString::Null QString::null = { };
+#endif
+
+
 QStringData* QString::makeSharedNull()
 {
     return shared_null=new QStringData;
diff --git a/qtools/qstring.h b/qtools/qstring.h
index 4357809..0dd6352 100644
--- a/qtools/qstring.h
+++ b/qtools/qstring.h
@@ -368,9 +368,15 @@ public:
     QString    &operator=( QChar c );
     QString    &operator=( char c );
 
-    QT_STATIC_CONST QString null;
-
-    bool	isNull()	const;
+    //QT_STATIC_CONST QString null;
+    //bool	isNull()	const;
+
+    struct Null { };
+    static const Null null;
+    inline QString(const Null &): d(shared_null) { d->ref(); }
+    inline QString &operator=(const Null &) { *this = QString(); return *this; }
+    inline bool isNull() const { return d == shared_null; }
+    
     bool	isEmpty()	const;
     uint	length()	const;
     void	truncate( uint pos );
@@ -662,8 +668,8 @@ inline QString &QString::operator=( QChar c )
 inline QString &QString::operator=( char c )
 { return *this = QString(QChar(c)); }
 
-inline bool QString::isNull() const
-{ return unicode() == 0; }
+//inline bool QString::isNull() const
+//{ return unicode() == 0; }
 
 inline bool QString::operator!() const
 { return isNull(); }
diff --git a/src/classdef.cpp b/src/classdef.cpp
index 9662cef..5911b35 100644
--- a/src/classdef.cpp
+++ b/src/classdef.cpp
@@ -296,6 +296,7 @@ QCString ClassDef::displayName() const
   {
     n="<"+n.left(n.length()-2)+">";
   }
+  //printf("ClassDef::displayName()=%s\n",n.data());
   return n;
 }
 
@@ -780,7 +781,12 @@ static void searchTemplateSpecs(/*in*/  Definition *d,
     }
     ClassDef *cd=(ClassDef *)d;
     if (!name.isEmpty()) name+="::";
-    name+=d->localName();
+    QCString clName = d->localName();
+    if (clName.right(2)=="-g" || clName.right(2)=="-p")
+    {
+      clName = clName.left(clName.length()-2);
+    }
+    name+=clName;
     bool isSpecialization = d->localName().find('<')!=-1;
     if (cd->templateArguments()) 
     {
@@ -1744,9 +1750,9 @@ void ClassDef::writeMemberList(OutputList &ol)
             if (md->isObjCMethod())
             {
               if (md->isStatic())
-                ol.writeString("+&nbsp;</td><td>");
+                ol.writeString("+&#160;</td><td>");
               else
-                ol.writeString("-&nbsp;</td><td>");
+                ol.writeString("-&#160;</td><td>");
             }
             else
               ol.writeString("</td><td>");
@@ -1793,9 +1799,9 @@ void ClassDef::writeMemberList(OutputList &ol)
             if (md->isObjCMethod())
             {
               if (md->isStatic())
-                ol.writeString("+&nbsp;</td><td>");
+                ol.writeString("+&#160;</td><td>");
               else
-                ol.writeString("-&nbsp;</td><td>");
+                ol.writeString("-&#160;</td><td>");
             }
             else
               ol.writeString("</td><td>");
@@ -2016,6 +2022,10 @@ void ClassDef::writeDeclaration(OutputList &ol,MemberDef *md,bool inGroup)
   QCString cn=name().right(name().length()-ri-2);
   if (!cn.isEmpty() && cn.at(0)!='@' && md)
   { 
+    if (cn.right(2)=="-p" || cn.right(2)=="-g")
+    {
+      cn = cn.left(cn.length()-2);
+    }
     ol.docify(" ");
     if (isLinkable())
     {
@@ -3088,6 +3098,7 @@ QCString ClassDef::qualifiedNameWithTemplateParameters(
   {
     clName = clName.left(clName.length()-2);
   }
+  //printf("m_impl->lang=%d clName=%s\n",m_impl->lang,clName.data());
   scName+=clName;
   ArgumentList *al=0;
   if (templateArguments())
@@ -3240,15 +3251,6 @@ void ClassDef::addMemberToList(MemberList::ListType lt,MemberDef *md,bool isBrie
   ml->setNeedsSorting((isBrief && sortBriefDocs) || (!isBrief && sortMemberDocs));
   ml->append(md);
 
-#if 0
-  if (( isBrief && sortBriefDocs ) ||
-      (!isBrief && sortMemberDocs)
-     )
-    ml->inSort(md);
-  else
-    ml->append(md);
-#endif
-
   // for members in the declaration lists we set the section, needed for member grouping
   if ((ml->listType()&MemberList::detailedLists)==0) md->setSectionList(this,ml);
 }
diff --git a/src/classlist.cpp b/src/classlist.cpp
index 196f8c2..81f96b2 100644
--- a/src/classlist.cpp
+++ b/src/classlist.cpp
@@ -150,6 +150,10 @@ void ClassSDict::writeDeclaration(OutputList &ol,const ClassDef::CompoundType *f
           if (localNames)
           {
             cname = cd->localName();
+            if (cname.right(2)=="-p" || cname.right(2)=="-g")
+            {
+              cname = cname.left(cname.length()-2);
+            }
           }
           else
           {
diff --git a/src/code.l b/src/code.l
index ba24ea2..ddc6763 100644
--- a/src/code.l
+++ b/src/code.l
@@ -1002,6 +1002,7 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,char *clName,
                       g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
     writeMultiLineCodeLink(ol,cd->getReference(),cd->getOutputFileBase(),0,clName,cd->briefDescriptionAsTooltip());
     addToSearchIndex(className);
+    g_theCallContext.setClass(cd);
     if (md)
     {
       Definition *d = md->getOuterScope()==Doxygen::globalScope ?
@@ -2380,7 +2381,9 @@ OPERATOR {ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}
 					}
 <Body>{SCOPENAME}/{BN}*[;,)\]]		{ // "int var;" or "var, var2" or "debug(f) macro" 
 					  addType();
-					  generateClassOrGlobalLink(*g_code,yytext,FALSE,TRUE);
+					  // changed this to generateFunctionLink, see bug 624514
+					  //generateClassOrGlobalLink(*g_code,yytext,FALSE,TRUE);
+					  generateFunctionLink(*g_code,yytext);
   					  g_name+=yytext; 
 					}
 <Body>{SCOPENAME}/{B}* 			{ // p->func()
diff --git a/src/commentscan.l b/src/commentscan.l
index bd92350..4ad0590 100644
--- a/src/commentscan.l
+++ b/src/commentscan.l
@@ -932,6 +932,11 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
 <Comment>"<!--"				{ 
   					  BEGIN(HtmlComment);
 					}
+<Comment>{B}*{CMD}"endinternal"{B}*	{
+  					  warn(yyFileName,yyLineNr,
+                                               "warning: found \\endinternal without matching \\internal"
+                                              );
+  					}
 <Comment>{B}*{CMD}[a-z_A-Z]+{B}*	{ // potentially interesting command
                                           // the {B}* in the front was added for bug620924
   					  QCString cmdName = QCString(yytext).stripWhiteSpace().data()+1;
@@ -1770,6 +1775,9 @@ RCSTAG    "$"{ID}":"[^\n$]+"$"
 					    BEGIN(Comment);
 					  }
   					}
+<SkipInternal>[@\\]"endinternal"[ \t]*  {
+					  BEGIN(Comment);
+					}
 <SkipInternal>[^ \\@\n]+		{ // skip non-special characters
   					}
 <SkipInternal>.				{ // any other character
@@ -2372,7 +2380,7 @@ static bool handleInternal(const QCString &)
   }
   else
   {
-    addOutput("\\internal "); 
+    //addOutput("\\internal "); 
   }
   return FALSE;
 }
diff --git a/src/config.l b/src/config.l
index 97571c8..b45097c 100644
--- a/src/config.l
+++ b/src/config.l
@@ -813,14 +813,14 @@ void Config::writeTemplate(FTextStream &t,bool sl,bool upd)
   if (!sl)
   {
     t << "# This file describes the settings to be used by the documentation system\n";
-    t << "# doxygen (www.doxygen.org) for a project\n";
+    t << "# doxygen (www.doxygen.org) for a project.\n";
     t << "#\n";
-    t << "# All text after a hash (#) is considered a comment and will be ignored\n";
+    t << "# All text after a hash (#) is considered a comment and will be ignored.\n";
     t << "# The format is:\n";
     t << "#       TAG = value [value, ...]\n";
     t << "# For lists items can also be appended using:\n";
     t << "#       TAG += value [value, ...]\n";
-    t << "# Values that contain spaces should be placed between quotes (\" \")\n";
+    t << "# Values that contain spaces should be placed between quotes (\" \").\n";
   }
   ConfigOption *option = m_options->first();
   while (option)
diff --git a/src/config.xml b/src/config.xml
index c3693ee..47c9148 100644
--- a/src/config.xml
+++ b/src/config.xml
@@ -152,7 +152,7 @@ are normally passed to the compiler using the -I flag.
     </option>
     <option type='bool' id='SHORT_NAMES' docs='
 If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
-(but less readable) file names. This can be useful is your file systems 
+(but less readable) file names. This can be useful if your file system 
 doesn&apos;t support long names like on DOS, Mac, or CD-ROM. 
 ' defval='0'/>
     <option type='bool' id='JAVADOC_AUTOBRIEF' docs='
@@ -238,7 +238,7 @@ If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
 to include (a tag file for) the STL sources as input, then you should 
 set this tag to YES in order to let doxygen match functions declarations and 
 definitions whose arguments contain STL classes (e.g. func(std::string); v.s. 
-func(std::string) {}). This also make the inheritance and collaboration 
+func(std::string) {}). This also makes the inheritance and collaboration 
 diagrams that involve STL classes more complete and accurate. 
 ' defval='0'/>
     <option type='bool' id='CPP_CLI_SUPPORT' docs='
@@ -253,7 +253,7 @@ instead of private inheritance when no explicit protection keyword is present.
     <option type='bool' id='IDL_PROPERTY_SUPPORT' docs='
 For Microsoft&apos;s IDL there are propget and propput attributes to indicate getter 
 and setter methods for a property. Setting this option to YES (the default) 
-will make doxygen to replace the get and set methods by a property in the 
+will make doxygen replace the get and set methods by a property in the 
 documentation. This will only work if the methods are indeed getting or 
 setting a simple type. If this is not the case, or you want to show the 
 methods anyway, you should set this option to NO. 
@@ -327,7 +327,7 @@ If this flag is set to YES, the members of anonymous namespaces will be
 extracted and appear in the documentation as a namespace called 
 &apos;anonymous_namespace{file}&apos;, where file will be replaced with the base 
 name of the file that contains the anonymous namespace. By default 
-anonymous namespace are hidden. 
+anonymous namespaces are hidden. 
 ' defval='0'/>
     <option type='bool' id='HIDE_UNDOC_MEMBERS' docs='
 If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
@@ -447,10 +447,10 @@ documentation sections, marked by \if sectionname ... \endif.
     </option>
     <option type='int' id='MAX_INITIALIZER_LINES' docs='
 The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
-the initial value of a variable or define consists of for it to appear in 
+the initial value of a variable or macro consists of for it to appear in 
 the documentation. If the initializer consists of more lines than specified 
 here it will be hidden. Use a value of 0 to hide initializers completely. 
-The appearance of the initializer of individual variables and defines in the 
+The appearance of the initializer of individual variables and macros in the 
 documentation can be controlled using \showinitializer or \hideinitializer 
 command in the documentation regardless of this setting. 
 ' minval='0' maxval='10000' defval='30'/>
@@ -514,7 +514,7 @@ parameters in a documented function, or documenting parameters that
 don&apos;t exist or using markup commands wrongly. 
 ' defval='1'/>
     <option type='bool' id='WARN_NO_PARAMDOC' docs='
-This WARN_NO_PARAMDOC option can be abled to get warnings for 
+The WARN_NO_PARAMDOC option can be abled to get warnings for 
 functions that are documented, but have no documentation for their parameters 
 or return value. If set to NO (the default) doxygen will only warn about 
 wrong or incomplete parameter documentation, but not about the absence of 
@@ -1402,7 +1402,7 @@ graphs for selected functions only using the \callergraph command.
 ' defval='0' depends='HAVE_DOT'/>
     <option type='bool' id='GRAPHICAL_HIERARCHY' docs='
 If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
-will graphical hierarchy of all classes instead of a textual one. 
+will generate a graphical hierarchy of all classes instead of a textual one. 
 ' defval='1' depends='HAVE_DOT'/>
     <option type='bool' id='DIRECTORY_GRAPH' docs='
 If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES 
@@ -1412,7 +1412,7 @@ relations between the files in the directories.
 ' defval='1' depends='HAVE_DOT'/>
     <option type='enum' id='DOT_IMAGE_FORMAT' defval='png' docs='
 The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
-generated by dot. Possible values are png, jpg, or gif 
+generated by dot. Possible values are png, jpg, or gif. 
 If left blank png will be used. 
 ' depends='HAVE_DOT'>
       <value name='png'/>
diff --git a/src/configoptions.cpp b/src/configoptions.cpp
index 5f7f281..9d4f75f 100644
--- a/src/configoptions.cpp
+++ b/src/configoptions.cpp
@@ -208,7 +208,7 @@ void addConfigOptions(Config *cfg)
   cb = cfg->addBool(
                  "SHORT_NAMES",
                  "If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter\n"
-                 "(but less readable) file names. This can be useful is your file systems\n"
+                 "(but less readable) file names. This can be useful if your file system\n"
                  "doesn't support long names like on DOS, Mac, or CD-ROM.",
                  FALSE
                 );
@@ -329,7 +329,7 @@ void addConfigOptions(Config *cfg)
                  "to include (a tag file for) the STL sources as input, then you should\n"
                  "set this tag to YES in order to let doxygen match functions declarations and\n"
                  "definitions whose arguments contain STL classes (e.g. func(std::string); v.s.\n"
-                 "func(std::string) {}). This also make the inheritance and collaboration\n"
+                 "func(std::string) {}). This also makes the inheritance and collaboration\n"
                  "diagrams that involve STL classes more complete and accurate.",
                  FALSE
                 );
@@ -353,7 +353,7 @@ void addConfigOptions(Config *cfg)
                  "IDL_PROPERTY_SUPPORT",
                  "For Microsoft's IDL there are propget and propput attributes to indicate getter\n"
                  "and setter methods for a property. Setting this option to YES (the default)\n"
-                 "will make doxygen to replace the get and set methods by a property in the\n"
+                 "will make doxygen replace the get and set methods by a property in the\n"
                  "documentation. This will only work if the methods are indeed getting or\n"
                  "setting a simple type. If this is not the case, or you want to show the\n"
                  "methods anyway, you should set this option to NO.",
@@ -459,7 +459,7 @@ void addConfigOptions(Config *cfg)
                  "extracted and appear in the documentation as a namespace called\n"
                  "'anonymous_namespace{file}', where file will be replaced with the base\n"
                  "name of the file that contains the anonymous namespace. By default\n"
-                 "anonymous namespace are hidden.",
+                 "anonymous namespaces are hidden.",
                  FALSE
                 );
   //----
@@ -641,10 +641,10 @@ void addConfigOptions(Config *cfg)
   ci = cfg->addInt(
                  "MAX_INITIALIZER_LINES",
                  "The MAX_INITIALIZER_LINES tag determines the maximum number of lines\n"
-                 "the initial value of a variable or define consists of for it to appear in\n"
+                 "the initial value of a variable or macro consists of for it to appear in\n"
                  "the documentation. If the initializer consists of more lines than specified\n"
                  "here it will be hidden. Use a value of 0 to hide initializers completely.\n"
-                 "The appearance of the initializer of individual variables and defines in the\n"
+                 "The appearance of the initializer of individual variables and macros in the\n"
                  "documentation can be controlled using \\showinitializer or \\hideinitializer\n"
                  "command in the documentation regardless of this setting.",
                  0,10000,30
@@ -744,7 +744,7 @@ void addConfigOptions(Config *cfg)
   //----
   cb = cfg->addBool(
                  "WARN_NO_PARAMDOC",
-                 "This WARN_NO_PARAMDOC option can be abled to get warnings for\n"
+                 "The WARN_NO_PARAMDOC option can be abled to get warnings for\n"
                  "functions that are documented, but have no documentation for their parameters\n"
                  "or return value. If set to NO (the default) doxygen will only warn about\n"
                  "wrong or incomplete parameter documentation, but not about the absence of\n"
@@ -2141,7 +2141,7 @@ void addConfigOptions(Config *cfg)
   cb = cfg->addBool(
                  "GRAPHICAL_HIERARCHY",
                  "If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen\n"
-                 "will graphical hierarchy of all classes instead of a textual one.",
+                 "will generate a graphical hierarchy of all classes instead of a textual one.",
                  TRUE
                 );
   cb->addDependency("HAVE_DOT");
@@ -2159,7 +2159,7 @@ void addConfigOptions(Config *cfg)
   ce = cfg->addEnum(
                  "DOT_IMAGE_FORMAT",
                  "The DOT_IMAGE_FORMAT tag can be used to set the image format of the images\n"
-                 "generated by dot. Possible values are png, jpg, or gif\n"
+                 "generated by dot. Possible values are png, jpg, or gif.\n"
                  "If left blank png will be used.",
                  "png"
                 );
diff --git a/src/defargs.l b/src/defargs.l
index f52d31f..048fafd 100644
--- a/src/defargs.l
+++ b/src/defargs.l
@@ -140,7 +140,7 @@ ID	[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]*
   					  g_curArgDefValue+=*yytext;
   					  BEGIN( CopyArgString );
   					}
-<ReadFuncArgType>"("([^:)]+{B}*"::")*{B}*[&*]+{B}*/{ID} { 
+<ReadFuncArgType>"("([^:)]+{B}*"::")*{B}*[&*\^]+{B}*/{ID} { 
   					  // function pointer as argument
 					  g_curArgTypeName+=yytext;
 					  //g_curArgTypeName=g_curArgTypeName.simplifyWhiteSpace();
diff --git a/src/definition.cpp b/src/definition.cpp
index fb31731..59906d5 100644
--- a/src/definition.cpp
+++ b/src/definition.cpp
@@ -474,6 +474,11 @@ void Definition::_setBriefDescription(const char *b,const char *briefFile,int br
       m_impl->brief->file = briefFile;
       m_impl->brief->line = briefLine;
     }
+    else
+    {
+      m_impl->brief->file = briefFile;
+      m_impl->brief->line = 1;
+    }
   }
 }
 
@@ -790,8 +795,8 @@ void Definition::writeSourceDef(OutputList &ol,const char *)
 
 void Definition::setBodySegment(int bls,int ble) 
 {
-  makeResident();
   //printf("setBodySegment(%d,%d) for %s\n",bls,ble,name().data());
+  makeResident();
   if (m_impl->body==0) m_impl->body = new BodyInfo;
   m_impl->body->startLine=bls; 
   m_impl->body->endLine=ble; 
@@ -1289,7 +1294,12 @@ void Definition::writePathFragment(OutputList &ol) const
     }
     else if (definitionType()==Definition::TypeClass)
     {
-      ol.writeObjectLink(getReference(),getOutputFileBase(),0,((const ClassDef*)this)->displayName());
+      QCString name = m_impl->localName;
+      if (name.right(2)=="-p" || name.right(2)=="-g")
+      {
+        name = name.left(name.length()-2);
+      }
+      ol.writeObjectLink(getReference(),getOutputFileBase(),0,name);
     }
     else
     {
diff --git a/src/dirdef.cpp b/src/dirdef.cpp
index 84fa3ab..333513b 100644
--- a/src/dirdef.cpp
+++ b/src/dirdef.cpp
@@ -434,7 +434,7 @@ void DirDef::writePathFragment(OutputList &ol) const
   if (m_parent)
   {
     m_parent->writePathFragment(ol);
-    ol.writeString("&nbsp;/&nbsp;");
+    ol.writeString("&#160;/&#160;");
   }
   ol.writeObjectLink(getReference(),getOutputFileBase(),0,shortName());
 }
@@ -675,7 +675,7 @@ static void writePartialDirPath(OutputList &ol,const DirDef *root,const DirDef *
   if (target->parent()!=root) 
   {
     writePartialDirPath(ol,root,target->parent());
-    ol.writeString("&nbsp;/&nbsp;");
+    ol.writeString("&#160;/&#160;");
   }
   ol.writeObjectLink(target->getReference(),target->getOutputFileBase(),0,target->shortName());
 }
@@ -685,7 +685,7 @@ static void writePartialFilePath(OutputList &ol,const DirDef *root,const FileDef
   if (fd->getDirDef() && fd->getDirDef()!=root)
   {
     writePartialDirPath(ol,root,fd->getDirDef());
-    ol.writeString("&nbsp;/&nbsp;");
+    ol.writeString("&#160;/&#160;");
   }
   if (fd->isLinkable())
   {
diff --git a/src/docsets.cpp b/src/docsets.cpp
index b69f91d..5138057 100644
--- a/src/docsets.cpp
+++ b/src/docsets.cpp
@@ -230,11 +230,8 @@ void DocSets::addContentsItem(bool isDir,
   }
 }
 
-void DocSets::addIndexItem(Definition *context,MemberDef *md,
-                           const char *anchor,const char *word)
+void DocSets::addIndexItem(Definition *context,MemberDef *md,const char *)
 {
-  (void)anchor;
-  (void)word;
   if (md==0 || context==0) return; // TODO: also index non members...
 
   FileDef *fd      = 0;
diff --git a/src/docsets.h b/src/docsets.h
index 31b5263..5244eb9 100644
--- a/src/docsets.h
+++ b/src/docsets.h
@@ -45,11 +45,7 @@ class DocSets  : public IndexIntf
                          const char *file = 0,
                          const char *anchor = 0
                         );
-    //void addIndexItem(const char *level1, const char *level2, 
-    //                  const char *contRef, const char *memRef,
-    //                  const char *anchor,const MemberDef *md);
-    void addIndexItem(Definition *context,MemberDef *md,
-                      const char *anchor,const char *word);
+    void addIndexItem(Definition *context,MemberDef *md,const char *title);
     void addIndexFile(const char *name);
     void addImageFile(const char *) {}
     void addStyleSheetFile(const char *) {}
diff --git a/src/doctokenizer.l b/src/doctokenizer.l
index 4285b6c..f1b50af 100644
--- a/src/doctokenizer.l
+++ b/src/doctokenizer.l
@@ -305,7 +305,7 @@ HFILEMASK ("."{FILESCHAR}*{FILEECHAR}+)*
 FILEMASK  ({FILESCHAR}*{FILEECHAR}+("."{FILESCHAR}*{FILEECHAR}+)*)|{HFILEMASK}
 LINKMASK  [^ \t\n\r\\@<&${}]+("("[^\n)]*")")?({BLANK}*("const"|"volatile"){BLANK}+)? 
 VERBATIM  "verbatim"{BLANK}*
-SPCMD1    {CMD}([a-z_A-Z0-9]+|{VERBATIM})
+SPCMD1    {CMD}([a-z_A-Z][a-z_A-Z0-9]*|{VERBATIM})
 SPCMD2    {CMD}[\\@<>&$#%~"]
 SPCMD3    {CMD}form#[0-9]+
 INOUT	  "in"|"out"|("in"{BLANK}*","{BLANK}*"out")|("out"{BLANK}*","{BLANK}*"in")
diff --git a/src/dot.cpp b/src/dot.cpp
index 58a8a84..3edbf18 100644
--- a/src/dot.cpp
+++ b/src/dot.cpp
@@ -535,9 +535,16 @@ bool DotRunner::run()
   QCString dotArgs;
   QListIterator<QCString> li(m_jobs);
   QCString *s;
+  QCString file      = m_file;
+  QCString path      = m_path;
+  QCString imageName = m_imageName;
+  QCString postCmd   = m_postCmd;
+  QCString postArgs  = m_postArgs;
+  bool checkResult   = m_checkResult;
+  bool cleanUp       = m_cleanUp;
   if (multiTargets)
   {
-    dotArgs="\""+m_file+"\"";
+    dotArgs="\""+file+"\"";
     for (li.toFirst();(s=li.current());++li)
     {
       dotArgs+=' ';
@@ -552,23 +559,25 @@ bool DotRunner::run()
   {
     for (li.toFirst();(s=li.current());++li)
     {
-      dotArgs="\""+m_file+"\" "+*s;
+      dotArgs="\""+file+"\" "+*s;
       if ((exitCode=portable_system(dotExe,dotArgs,FALSE))!=0)
       {
         goto error;
       }
     }
   }
-  if (!m_postCmd.isEmpty() && portable_system(m_postCmd,m_postArgs)!=0)
+  if (!postCmd.isEmpty() && portable_system(postCmd,postArgs)!=0)
   {
     err("error: Problems running '%s' as a post-processing step for dot output\n",m_postCmd.data());
     return FALSE;
   }
-  if (m_checkResult) checkDotResult(m_imageName);
-  if (m_cleanUp) 
+  if (checkResult) checkDotResult(imageName);
+  if (cleanUp) 
   {
     //printf("removing dot file %s\n",m_file.data());
-    QDir(m_path).remove(m_file);
+    //QDir(path).remove(file);
+    m_cleanupItem.file = file;
+    m_cleanupItem.path = path;
   }
   return TRUE;
 error:
@@ -721,6 +730,7 @@ uint DotRunnerQueue::count() const
 DotWorkerThread::DotWorkerThread(int id,DotRunnerQueue *queue)
       : m_id(id), m_queue(queue)
 {
+  m_cleanupItems.setAutoDelete(TRUE);
 }
 
 void DotWorkerThread::run()
@@ -729,6 +739,21 @@ void DotWorkerThread::run()
   while ((runner=m_queue->dequeue()))
   {
     runner->run();
+    DotRunner::CleanupItem cleanup = runner->cleanup();
+    if (!cleanup.file.isEmpty())
+    {
+      m_cleanupItems.append(new DotRunner::CleanupItem(cleanup));
+    }
+  }
+}
+
+void DotWorkerThread::cleanup()
+{
+  QListIterator<DotRunner::CleanupItem> it(m_cleanupItems);
+  DotRunner::CleanupItem *ci;
+  for (;(ci=it.current());++it)
+  {
+    QDir(ci->path).remove(ci->file);
   }
 }
 
@@ -865,6 +890,11 @@ bool DotManager::run()
   {
     m_workers.at(i)->wait();
   }
+  // clean up dot files from main thread
+  for (i=0;i<(int)m_workers.count();i++)
+  {
+    m_workers.at(i)->cleanup();
+  }
   portable_sysTimerStop();
   if (setPath)
   {
@@ -3182,6 +3212,7 @@ void generateGraphLegend(const char *path)
   {
     removeDotGraph(absDotName);
   }
+  Doxygen::indexList.addImageFile(imgName);
 
 }
 
diff --git a/src/dot.h b/src/dot.h
index 19f5ae4..c3d2c1d 100644
--- a/src/dot.h
+++ b/src/dot.h
@@ -321,6 +321,12 @@ class DotGroupCollaboration
 class DotRunner
 {
   public:
+    struct CleanupItem
+    {
+      QCString path;
+      QCString file;
+    };
+
     /** Creates a runner for a dot \a file. */
     DotRunner(const QCString &file,const QCString &fontPath,bool checkResult,
         const QCString &imageName = QCString());
@@ -336,6 +342,8 @@ class DotRunner
 
     /** Runs dot for all jobs added. */
     bool run();
+    CleanupItem cleanup() const { return m_cleanupItem; }
+
   private:
     QList<QCString> m_jobs;
     QCString m_postArgs;
@@ -345,6 +353,7 @@ class DotRunner
     bool m_checkResult;
     QCString m_imageName;
     bool m_cleanUp;
+    CleanupItem m_cleanupItem;
 };
 
 /** @brief Helper class to insert a set of map file into an output file */
@@ -388,9 +397,11 @@ class DotWorkerThread : public QThread
   public:
     DotWorkerThread(int id,DotRunnerQueue *queue);
     void run();
+    void cleanup();
   private:
     int m_id;
     DotRunnerQueue *m_queue;
+    QList<DotRunner::CleanupItem> m_cleanupItems;
 };
 
 /** @brief singleton that manages dot relation actions */
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index 1818621..0c3638d 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -1384,7 +1384,7 @@ static void buildNamespaceList(EntryNav *rootNav)
           tagName=rootNav->tagInfo()->tagName;
           tagFileName=rootNav->tagInfo()->fileName;
         }
-        //printf("++ new namespace %d\n",fullName.data());
+        //printf("++ new namespace %s\n",fullName.data());
         NamespaceDef *nd=new NamespaceDef(root->fileName,root->startLine,fullName,tagName,tagFileName);
         nd->setDocumentation(root->doc,root->docFile,root->docLine); // copy docs to definition
         nd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
@@ -1552,7 +1552,7 @@ static void findUsingDirectives(EntryNav *rootNav)
       }
       else // unknown namespace, but add it anyway.
       {
-        //printf("++ new unknown namespace %s\n",name.data());
+        printf("++ new unknown namespace %s\n",name.data());
         NamespaceDef *nd=new NamespaceDef(root->fileName,root->startLine,name);
         nd->setDocumentation(root->doc,root->docFile,root->docLine); // copy docs to definition
         nd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
@@ -2194,7 +2194,7 @@ static MemberDef *addVariableToFile(
  */
 static int findFunctionPtr(const QCString &type,int *pLength=0)
 {
-  static const QRegExp re("([^)]*\\*[^)]*)");
+  static const QRegExp re("([^)]*[\\*\\^][^)]*)");
   int i=-1,l;
   if (!type.isEmpty() &&             // return type is non-empty
       (i=re.match(type,0,&l))!=-1 && // contains (...*...)
@@ -2204,10 +2204,12 @@ static int findFunctionPtr(const QCString &type,int *pLength=0)
      )
   {
     if (pLength) *pLength=l;
+    //printf("findFunctionPtr=%d\n",i);
     return i;
   }
   else
   {
+    //printf("findFunctionPtr=%d\n",-1);
     return -1;
   }
 }
@@ -2969,8 +2971,11 @@ static void buildFunctionList(EntryNav *rootNav)
                 md->setDocumentation(root->doc,root->docFile,root->docLine);
                 md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
                 md->setDocsForDefinition(!root->proto);
-                md->setBodySegment(root->bodyLine,root->endBodyLine);
-                md->setBodyDef(rfd);
+                if (md->getStartBodyLine()!=-1 && md->getStartBodyLine()==-1)
+                {
+                  md->setBodySegment(root->bodyLine,root->endBodyLine);
+                  md->setBodyDef(rfd);
+                }
 
                 if (md->briefDescription().isEmpty() && !root->brief.isEmpty())
                 {
@@ -3633,6 +3638,10 @@ static ClassDef *findClassWithinClassContext(Definition *context,ClassDef *cd,co
   {
     result = getResolvedClass(cd,fd,name,0,0,TRUE,TRUE);
   }
+  if (result==0) // try direct class, needed for namespaced classes imported via tag files (see bug624095)
+  {
+    result = getClass(name);
+  }
   //printf("** Trying to find %s within context %s class %s result=%s lookup=%p\n",
   //       name.data(),
   //       context ? context->name().data() : "<none>",
@@ -3800,7 +3809,7 @@ static void findUsedClassesForClass(EntryNav *rootNav,
             ClassDef *usedCd = Doxygen::hiddenClasses->find(type);
             if (usedCd==0 && !Config_getBool("HIDE_UNDOC_RELATIONS"))
             {
-              if (type.right(2)=="(*") // type is a function pointer
+              if (type.right(2)=="(*" || type.right(2)=="(^") // type is a function pointer
               {
                 type+=md->argsString();
               }
diff --git a/src/doxygen.css b/src/doxygen.css
index 4b20a23..46216c2 100644
--- a/src/doxygen.css
+++ b/src/doxygen.css
@@ -158,6 +158,7 @@ div.ah {
 	border-radius: 0.5em;
 	-webkit-border-radius: .5em;
 	-moz-border-radius: .5em;
+	box-shadow: 2px 2px 3px #999;
 	-webkit-box-shadow: 2px 2px 3px #999;
 	-moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
 	background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444));
@@ -167,7 +168,6 @@ div.ah {
 div.groupHeader {
 	margin-left: 16px;
 	margin-top: 12px;
-	margin-bottom: 6px;
 	font-weight: bold;
 }
 
@@ -376,7 +376,7 @@ table.memberdecls {
 	font-size: 80%;
 	color: ##60;
 	font-weight: normal;
-	margin-left: 3px;
+	margin-left: 9px;
 }
 
 .memnav {
@@ -407,6 +407,10 @@ table.memberdecls {
         color: ##2b;
         font-weight: bold;
         text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+        /* opera specific markup */
+        box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+        border-top-right-radius: 8px;
+        border-top-left-radius: 8px;
         /* firefox specific markup */
         -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
         -moz-border-radius-topright: 8px;
@@ -428,6 +432,10 @@ table.memberdecls {
         padding: 2px 5px;
         background-color: ##FC;
         border-top-width: 0;
+        /* opera specific markup */
+        border-bottom-left-radius: 8px;
+        border-bottom-right-radius: 8px;
+        box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
         /* firefox specific markup */
         -moz-border-radius-bottomleft: 8px;
         -moz-border-radius-bottomright: 8px;
diff --git a/src/doxygen_css.h b/src/doxygen_css.h
index fd64f79..42878a6 100644
--- a/src/doxygen_css.h
+++ b/src/doxygen_css.h
@@ -158,6 +158,7 @@
 "	border-radius: 0.5em;\n"
 "	-webkit-border-radius: .5em;\n"
 "	-moz-border-radius: .5em;\n"
+"	box-shadow: 2px 2px 3px #999;\n"
 "	-webkit-box-shadow: 2px 2px 3px #999;\n"
 "	-moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;\n"
 "	background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444));\n"
@@ -167,7 +168,6 @@
 "div.groupHeader {\n"
 "	margin-left: 16px;\n"
 "	margin-top: 12px;\n"
-"	margin-bottom: 6px;\n"
 "	font-weight: bold;\n"
 "}\n"
 "\n"
@@ -376,7 +376,7 @@
 "	font-size: 80%;\n"
 "	color: ##60;\n"
 "	font-weight: normal;\n"
-"	margin-left: 3px;\n"
+"	margin-left: 9px;\n"
 "}\n"
 "\n"
 ".memnav {\n"
@@ -407,6 +407,10 @@
 "        color: ##2b;\n"
 "        font-weight: bold;\n"
 "        text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);\n"
+"        /* opera specific markup */\n"
+"        box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);\n"
+"        border-top-right-radius: 8px;\n"
+"        border-top-left-radius: 8px;\n"
 "        /* firefox specific markup */\n"
 "        -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;\n"
 "        -moz-border-radius-topright: 8px;\n"
@@ -428,6 +432,10 @@
 "        padding: 2px 5px;\n"
 "        background-color: ##FC;\n"
 "        border-top-width: 0;\n"
+"        /* opera specific markup */\n"
+"        border-bottom-left-radius: 8px;\n"
+"        border-bottom-right-radius: 8px;\n"
+"        box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);\n"
 "        /* firefox specific markup */\n"
 "        -moz-border-radius-bottomleft: 8px;\n"
 "        -moz-border-radius-bottomright: 8px;\n"
diff --git a/src/eclipsehelp.cpp b/src/eclipsehelp.cpp
index 8abca03..8669530 100644
--- a/src/eclipsehelp.cpp
+++ b/src/eclipsehelp.cpp
@@ -181,8 +181,7 @@ void EclipseHelp::addContentsItem(
 void EclipseHelp::addIndexItem(
     Definition * /* context */,
     MemberDef * /* md */,
-    const char * /* anchor */,
-    const char * /* word */) 
+    const char * /* title */)
 {
 }
 
diff --git a/src/eclipsehelp.h b/src/eclipsehelp.h
index 645292f..2df764f 100644
--- a/src/eclipsehelp.h
+++ b/src/eclipsehelp.h
@@ -51,8 +51,7 @@ class EclipseHelp : public IndexIntf
     virtual void decContentsDepth();
     virtual void addContentsItem(bool isDir, const char *name, const char *ref = 0,
                                  const char *file = 0, const char *anchor = 0);
-    virtual void addIndexItem(Definition *context,MemberDef *md,
-                              const char *anchor,const char *word);
+    virtual void addIndexItem(Definition *context,MemberDef *md,const char *title);
     virtual void addIndexFile(const char *name);
     virtual void addImageFile(const char *name);
     virtual void addStyleSheetFile(const char *name);
diff --git a/src/ftvhelp.cpp b/src/ftvhelp.cpp
index c391a34..95ff514 100644
--- a/src/ftvhelp.cpp
+++ b/src/ftvhelp.cpp
@@ -509,7 +509,7 @@ void FTVHelp::generateLink(FTextStream &t,FTVNode *n)
     t << "</a>";
     if (!n->ref.isEmpty())
     {
-      t << "&nbsp;[external]";
+      t << "&#160;[external]";
     }
   }
 }
diff --git a/src/ftvhelp.h b/src/ftvhelp.h
index 5cbd073..a857f16 100644
--- a/src/ftvhelp.h
+++ b/src/ftvhelp.h
@@ -86,7 +86,7 @@ class FTVHelp : public IndexIntf
     //void addIndexItem(const char *, const char *, 
     //                  const char *, const char *,
     //                  const char *, const MemberDef *) {}
-    void addIndexItem(Definition *,MemberDef *,const char *,const char *) {}
+    void addIndexItem(Definition *,MemberDef *,const char *) {}
     void addIndexFile(const char *) {}
     void addImageFile(const char *) {}
     void addStyleSheetFile(const char *) {}
diff --git a/src/groupdef.cpp b/src/groupdef.cpp
index 4ddcb58..aaf4d1b 100644
--- a/src/groupdef.cpp
+++ b/src/groupdef.cpp
@@ -867,7 +867,7 @@ void GroupDef::writeDocumentation(OutputList &ol)
     }
   }
 
-  Doxygen::indexList.addIndexItem(this,0,0,title);
+  Doxygen::indexList.addIndexItem(this,0,title);
 
   if (!Config_getString("GENERATE_TAGFILE").isEmpty()) 
   {
diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp
index c5c2b67..8cebd4c 100644
--- a/src/htmldocvisitor.cpp
+++ b/src/htmldocvisitor.cpp
@@ -200,7 +200,7 @@ void HtmlDocVisitor::visit(DocSymbol *s)
     case DocSymbol::Szlig:   m_t << "&szlig;"; break;
     case DocSymbol::Cedil:   m_t << "&" << s->letter() << "cedil;"; break;
     case DocSymbol::Ring:    m_t << "&" << s->letter() << "ring;"; break;
-    case DocSymbol::Nbsp:    m_t << "&nbsp;"; break;
+    case DocSymbol::Nbsp:    m_t << "&#160;"; break;
     case DocSymbol::AElig:   m_t << "&AElig;"; break;
     case DocSymbol::Aelig:   m_t << "&aelig;"; break;
     default:
@@ -518,7 +518,7 @@ void HtmlDocVisitor::visit(DocIndexEntry *e)
   //       e->scope()  ? e->scope()->name().data()  : "<null>",
   //       e->member() ? e->member()->name().data() : "<null>"
   //      );
-  Doxygen::indexList.addIndexItem(e->scope(),e->member(),anchor,e->entry());
+  Doxygen::indexList.addIndexItem(e->scope(),e->member(),e->entry());
 }
 
 void HtmlDocVisitor::visit(DocSimpleSectSep *)
@@ -1361,7 +1361,7 @@ void HtmlDocVisitor::visitPre(DocParamList *pl)
     {
       m_t << "in,out";
     }
-    m_t << "]</tt>&nbsp;";
+    m_t << "]</tt>&#160;";
   }
   m_t << "</td><td valign=\"top\"><em>";
   //QStrListIterator li(pl->parameters());
@@ -1381,7 +1381,7 @@ void HtmlDocVisitor::visitPre(DocParamList *pl)
       visit((DocLinkedWord*)param); 
     }
   }
-  m_t << "</em>&nbsp;</td><td>";
+  m_t << "</em>&#160;</td><td>";
 }
 
 void HtmlDocVisitor::visitPost(DocParamList *)
diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp
index 9be1600..708cab0 100644
--- a/src/htmlgen.cpp
+++ b/src/htmlgen.cpp
@@ -952,7 +952,7 @@ void HtmlGenerator::writeFooterFile(QFile &file)
   FTextStream t(&file);
   t << "<hr class=\"footer\"/><address class=\"footer\"><small>\n";
   t << theTranslator->trGeneratedAt( "$datetime", "$projectname" );
-  t << "&nbsp;<a href=\"http://www.doxygen.org/index.html\">"
+  t << "&#160;<a href=\"http://www.doxygen.org/index.html\">"
     << "<img class=\"footer\" src=\"$relpath$doxygen.png\" alt=\"doxygen\"/>"
     << "</a> $doxygenversion";
   t << "</small></address>\n"
@@ -1144,7 +1144,7 @@ static void writePageFooter(FTextStream &t,const QCString &lastTitle,
     {
       t << theTranslator->trGeneratedBy();
     }
-    t << "&nbsp;" << endl << "<a href=\"http://www.doxygen.org/index.html\">";
+    t << "&#160;" << endl << "<a href=\"http://www.doxygen.org/index.html\">";
     t << endl << "<img class=\"footer\" src=\"" << relPath << "doxygen.png\" alt=\"doxygen\"/>"
       << "</a> " << versionString << " ";
     t << "</small></address>";
@@ -1502,7 +1502,7 @@ void HtmlGenerator::codify(const char *str)
                    break;
         case '"':  t << "&quot;"; col++;
                    break;
-        //case ' ':  t << "&nbsp;"; col++;
+        //case ' ':  t << "&#160;"; col++;
         //           break;
         case '\\':
                    if (*p=='<')
@@ -1531,7 +1531,8 @@ void HtmlGenerator::writeChar(char c)
 
 //--- helper function for dynamic sections -------------------------
 
-static void startSectionHeader(FTextStream &t,int sectionCount)
+static void startSectionHeader(FTextStream &t,
+                               const QCString &relPath,int sectionCount)
 {
   static bool dynamicSections = Config_getBool("HTML_DYNAMIC_SECTIONS");
   if (dynamicSections)
@@ -1540,7 +1541,8 @@ static void startSectionHeader(FTextStream &t,int sectionCount)
          "onclick=\"return toggleVisibility(this)\" "
          "class=\"dynheader closed\" "
          "style=\"cursor:pointer;\">" << endl;
-    t << "  <img id=\"dynsection-" << sectionCount << "-trigger\" src=\"closed.png\"/> ";
+    t << "  <img id=\"dynsection-" << sectionCount << "-trigger\" src=\"" 
+      << relPath << "closed.png\"/> ";
   }
   else
   {
@@ -1597,7 +1599,7 @@ static void endSectionContent(FTextStream &t)
 
 void HtmlGenerator::startClassDiagram()
 {
-  startSectionHeader(t,m_sectionCount);
+  startSectionHeader(t,relPath,m_sectionCount);
 }
 
 void HtmlGenerator::endClassDiagram(const ClassDiagram &d,
@@ -1702,7 +1704,7 @@ void HtmlGenerator::insertMemberAlign(bool templ)
   if (Config_getBool("HTML_ALIGN_MEMBERS"))
   {
     QCString className = templ ? "memTemplItemRight" : "memItemRight";
-    t << "&nbsp;</td><td class=\"" << className << "\" valign=\"bottom\">"; 
+    t << "&#160;</td><td class=\"" << className << "\" valign=\"bottom\">"; 
   }
 }
 
@@ -1711,7 +1713,7 @@ void HtmlGenerator::startMemberDescription()
   DBG_HTML(t << "<!-- startMemberDescription -->" << endl)
   if (Config_getBool("HTML_ALIGN_MEMBERS"))
   {
-    t << "<tr><td class=\"mdescLeft\">&nbsp;</td><td class=\"mdescRight\">"; 
+    t << "<tr><td class=\"mdescLeft\">&#160;</td><td class=\"mdescRight\">"; 
   }
   else
   {
@@ -1791,7 +1793,7 @@ void HtmlGenerator::startMemberSubtitle()
 void HtmlGenerator::endMemberSubtitle()
 {
   DBG_HTML(t << "<!-- endMemberSubtitle -->" << endl)
-  if (Config_getBool("HTML_ALIGN_MEMBERS")) t << "<br/><br/></td></tr>" << endl;
+  if (Config_getBool("HTML_ALIGN_MEMBERS")) t << "<br/></td></tr>" << endl;
 }
 
 void HtmlGenerator::startIndexList() 
@@ -1918,7 +1920,7 @@ void HtmlGenerator::startParameterType(bool first,const char *key)
 void HtmlGenerator::endParameterType()
 {
   DBG_HTML(t << "<!-- endParameterType -->" << endl;)
-  t << "&nbsp;</td>" << endl;
+  t << "&#160;</td>" << endl;
 }
 
 void HtmlGenerator::startParameterName(bool /*oneArgOnly*/)
@@ -1936,13 +1938,13 @@ void HtmlGenerator::endParameterName(bool last,bool emptyList,bool closeBracket)
     {
       t << "</td>" << endl;
       t << "          <td>";
-      if (closeBracket) t << "&nbsp;)";
-      t << "&nbsp;</td>" << endl;
+      if (closeBracket) t << "&#160;)";
+      t << "&#160;</td>" << endl;
       t << "          <td>";
     }
     else
     {
-      t << "</td><td>&nbsp;</td>" << endl;
+      t << "</td><td>&#160;</td>" << endl;
       t << "        </tr>" << endl;
       t << "        <tr>" << endl;
       t << "          <td></td>" << endl;
@@ -1982,7 +1984,7 @@ void HtmlGenerator::endMemberDoc(bool hasArgs)
 
 void HtmlGenerator::startDotGraph()
 {
-  startSectionHeader(t,m_sectionCount);
+  startSectionHeader(t,relPath,m_sectionCount);
 }
 
 void HtmlGenerator::endDotGraph(const DotClassGraph &g)
@@ -2008,7 +2010,7 @@ void HtmlGenerator::endDotGraph(const DotClassGraph &g)
 
 void HtmlGenerator::startInclDepGraph()
 {
-  startSectionHeader(t,m_sectionCount);
+  startSectionHeader(t,relPath,m_sectionCount);
 }
 
 void HtmlGenerator::endInclDepGraph(const DotInclDepGraph &g)
@@ -2026,7 +2028,7 @@ void HtmlGenerator::endInclDepGraph(const DotInclDepGraph &g)
 
 void HtmlGenerator::startGroupCollaboration()
 {
-  startSectionHeader(t,m_sectionCount);
+  startSectionHeader(t,relPath,m_sectionCount);
 }
 
 void HtmlGenerator::endGroupCollaboration(const DotGroupCollaboration &g)
@@ -2044,7 +2046,7 @@ void HtmlGenerator::endGroupCollaboration(const DotGroupCollaboration &g)
 
 void HtmlGenerator::startCallGraph()
 {
-  startSectionHeader(t,m_sectionCount);
+  startSectionHeader(t,relPath,m_sectionCount);
 }
 
 void HtmlGenerator::endCallGraph(const DotCallGraph &g)
@@ -2062,7 +2064,7 @@ void HtmlGenerator::endCallGraph(const DotCallGraph &g)
 
 void HtmlGenerator::startDirDepGraph()
 {
-  startSectionHeader(t,m_sectionCount);
+  startSectionHeader(t,relPath,m_sectionCount);
 }
 
 void HtmlGenerator::endDirDepGraph(const DotDirDeps &g)
@@ -2133,7 +2135,7 @@ void HtmlGenerator::writeNonBreakableSpace(int n)
   int i;
   for (i=0;i<n;i++)
   {
-    t << "&nbsp;";
+    t << "&#160;";
   }
 }
 
@@ -2254,7 +2256,7 @@ static void endQuickIndexItem(FTextStream &t)
 
 static QCString fixSpaces(const QCString &s)
 {
-  return substitute(s," ","&nbsp;");
+  return substitute(s," ","&#160;");
 }
 
 static bool quickLinkVisible(LayoutNavEntry::Kind kind)
@@ -2353,7 +2355,7 @@ static void renderQuickLinksAsTabs(FTextStream &t,const QCString &relPath,
           t << "      <form action=\"" << relPath << "search.php\" method=\"get\">\n";
           t << "        <table cellspacing=\"0\" cellpadding=\"0\" border=\"0\">\n";
           t << "          <tr>\n";
-          t << "            <td><label>&nbsp;" << searchFor << "&nbsp;</label></td>\n";
+          t << "            <td><label>&#160;" << searchFor << "&#160;</label></td>\n";
           if (!highlightSearch)
           {
             t << "            <td><input type=\"text\" name=\"query\" value=\"\" size=\"20\" accesskey=\"s\"/></td>\n";
@@ -2543,7 +2545,7 @@ void HtmlGenerator::writeSearchPage()
     }
     else
     {
-      t << "&nbsp;\n<div class=\"qindex\">\n";
+      t << "&#160;\n<div class=\"qindex\">\n";
       t << "  <form class=\"search\" action=\"search.php\" "
         << "method=\"get\">\n";
     }
@@ -2684,7 +2686,7 @@ void HtmlGenerator::endConstraintParam()
 
 void HtmlGenerator::startConstraintType()
 {
-  t << "<td>&nbsp;:</td><td valign=\"top\"><em>";
+  t << "<td>&#160;:</td><td valign=\"top\"><em>";
 }
 
 void HtmlGenerator::endConstraintType()
@@ -2694,7 +2696,7 @@ void HtmlGenerator::endConstraintType()
 
 void HtmlGenerator::startConstraintDocs()
 {
-  t << "<td>&nbsp;";
+  t << "<td>&#160;";
 }
 
 void HtmlGenerator::endConstraintDocs()
diff --git a/src/htmlhelp.cpp b/src/htmlhelp.cpp
index 037dd72..32077e7 100644
--- a/src/htmlhelp.cpp
+++ b/src/htmlhelp.cpp
@@ -627,7 +627,7 @@ void HtmlHelp::addContentsItem(bool isDir,
 
 
 void HtmlHelp::addIndexItem(Definition *context,MemberDef *md,
-                            const char *anc,const char *word)
+                            const char *word)
 {
   if (md)
   {
@@ -647,14 +647,14 @@ void HtmlHelp::addIndexItem(Definition *context,MemberDef *md,
     QCString level2  = md->name();
     QCString contRef = separateMemberPages ? cfname : cfiname;
     QCString memRef  = cfname;
-    QCString anchor  = anc;
+    QCString anchor  = md->anchor();
     index->addItem(level1,level2,contRef,anchor,TRUE,FALSE);
     index->addItem(level2,level1,memRef,anchor,TRUE,TRUE);
   }
   else if (context)
   {
     QCString level1  = word ? QCString(word) : context->name();
-    index->addItem(level1,0,context->getOutputFileBase(),anc,TRUE,FALSE);
+    index->addItem(level1,0,context->getOutputFileBase(),0,TRUE,FALSE);
   }
 }
 
diff --git a/src/htmlhelp.h b/src/htmlhelp.h
index bee84dd..0849007 100644
--- a/src/htmlhelp.h
+++ b/src/htmlhelp.h
@@ -77,8 +77,7 @@ class HtmlHelp  : public IndexIntf
     //void addIndexItem(const char *level1, const char *level2, 
     //                  const char *contRef, const char *memRef,
     //                  const char *anchor,const MemberDef *md);
-    void addIndexItem(Definition *context,MemberDef *md,
-                      const char *anchor,const char *word);
+    void addIndexItem(Definition *context,MemberDef *md,const char *title);
     void addIndexFile(const char *name);
     void addImageFile(const char *) {}
     void addStyleSheetFile(const char *) {}
diff --git a/src/index.cpp b/src/index.cpp
index eab4f4e..306f831 100644
--- a/src/index.cpp
+++ b/src/index.cpp
@@ -266,7 +266,7 @@ static void endQuickIndexItem(OutputList &ol)
 
 static QCString fixSpaces(const QCString &s)
 {
-  return substitute(s," ","&nbsp;");
+  return substitute(s," ","&#160;");
 }
 
 
@@ -1248,7 +1248,7 @@ void writeAlphabeticalClassList(OutputList &ol)
   {
     if (indexLetterUsed[l])
     {
-      if (headerItems) alphaLinks += "&nbsp;|&nbsp;";
+      if (headerItems) alphaLinks += "&#160;|&#160;";
       headerItems++;
       alphaLinks += (QCString)"<a class=\"qindex\" href=\"#letter_" + 
                     (char)l + "\">" + 
@@ -1362,9 +1362,9 @@ void writeAlphabeticalClassList(OutputList &ol)
           ol.writeString("\"></a>");
           ol.writeString("<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">"
                            "<tr>"
-                             "<td><div class=\"ah\">&nbsp;&nbsp;"); 
+                             "<td><div class=\"ah\">&#160;&#160;"); 
           ol.writeString(s);
-          ol.writeString(         "&nbsp;&nbsp;</div>"
+          ol.writeString(         "&#160;&#160;</div>"
                              "</td>"
                            "</tr>"
                          "</table>\n");
@@ -1386,6 +1386,10 @@ void writeAlphabeticalClassList(OutputList &ol)
         {
           nsDispName=namesp.copy();
         }
+        if (cname.right(2)=="-g" || cname.right(2)=="-p")
+        {
+          cname = cname.left(cname.length()-2);
+        }
 
         ol.writeObjectLink(cd->getReference(),
                            cd->getOutputFileBase(),0,cname);
@@ -1853,6 +1857,7 @@ void writeQuickMemberIndex(OutputList &ol,
   for (i=33;i<127;i++)
   {
     char is[2];is[0]=(char)i;is[1]='\0';
+    QCString ci = letterToLabel((char)i);
     if (charUsed[i].count()>0)
     {
       QCString anchor;
@@ -1863,7 +1868,7 @@ void writeQuickMemberIndex(OutputList &ol,
         anchor=fullName+extension+"#index_";
       else 
         anchor=fullName+QCString().sprintf("_0x%02x",i)+extension+"#index_";
-      startQuickIndexItem(ol,anchor+is,i==page,TRUE,first);
+      startQuickIndexItem(ol,anchor+ci,i==page,TRUE,first);
       ol.writeString(is);
       endQuickIndexItem(ol);
       first=FALSE;
@@ -1978,7 +1983,7 @@ static void writeClassMemberIndexFiltered(OutputList &ol, ClassMemberHighlight h
       {
         // hack to work around a mozilla bug, which refuses to switch to
         // normal lists otherwise
-        ol.writeString("&nbsp;");
+        ol.writeString("&#160;");
       }
       //ol.newParagraph();  // FIXME:PARA
       writeMemberList(ol,quickIndex,
@@ -2109,7 +2114,7 @@ static void writeFileMemberIndexFiltered(OutputList &ol, FileMemberHighlight hl)
       {
         // hack to work around a mozilla bug, which refuses to switch to
         // normal lists otherwise
-        ol.writeString("&nbsp;");
+        ol.writeString("&#160;");
       }
       //ol.newParagraph();  // FIXME:PARA
       //writeFileMemberList(ol,quickIndex,hl,page);
@@ -2237,7 +2242,7 @@ static void writeNamespaceMemberIndexFiltered(OutputList &ol,
       {
         // hack to work around a mozilla bug, which refuses to switch to
         // normal lists otherwise
-        ol.writeString("&nbsp;");
+        ol.writeString("&#160;");
       }
       //ol.newParagraph(); // FIXME:PARA
 
@@ -2772,7 +2777,7 @@ void writeJavascriptSearchIndex()
                     if (fd==0) fd = md->getFileDef();
                     if (fd)
                     {
-                      if (!prefix.isEmpty()) prefix+=":&nbsp;";
+                      if (!prefix.isEmpty()) prefix+=":&#160;";
                       t << prefix << convertToXML(fd->localName());
                       found = TRUE;
                     }
@@ -2916,7 +2921,7 @@ void writeSearchCategories(FTextStream &t)
     {
       t << "<a class=\"SelectItem\" href=\"javascript:void(0)\" "
         << "onclick=\"searchBox.OnSelectItem(" << j << ")\">"
-        << "<span class=\"SelectionMark\">&nbsp;</span>"
+        << "<span class=\"SelectionMark\">&#160;</span>"
         << convertToXML(map.categoryLabel[i])
         << "</a>";
       j++;
diff --git a/src/index.h b/src/index.h
index c5d1bb3..93bfee4 100644
--- a/src/index.h
+++ b/src/index.h
@@ -38,8 +38,7 @@ class IndexIntf
     virtual void decContentsDepth() = 0;
     virtual void addContentsItem(bool isDir, const char *name, const char *ref = 0, 
                                  const char *file = 0, const char *anchor = 0) = 0;
-    virtual void addIndexItem(Definition *context,MemberDef *md,
-                              const char *anchor,const char *word) = 0;
+    virtual void addIndexItem(Definition *context,MemberDef *md,const char *title) = 0;
     virtual void addIndexFile(const char *name) = 0;
     virtual void addImageFile(const char *name) = 0;
     virtual void addStyleSheetFile(const char *name) = 0;
@@ -70,6 +69,13 @@ class IndexList : public IndexIntf
       for (li.toFirst();li.current();++li) (li.current()->*methodPtr)(a1);
     }
 
+    template<typename A1,typename A2,typename A3>
+    void foreach(void (IndexIntf::*methodPtr)(A1,A2,A3),A1 a1,A2 a2,A3 a3)
+    {
+      QListIterator<IndexIntf> li(m_intfs);
+      for (li.toFirst();li.current();++li) (li.current()->*methodPtr)(a1,a2,a3);
+    }
+
     template<typename A1,typename A2,typename A3,typename A4>
     void foreach(void (IndexIntf::*methodPtr)(A1,A2,A3,A4),A1 a1,A2 a2,A3 a3,A4 a4)
     {
@@ -104,10 +110,9 @@ class IndexList : public IndexIntf
                          const char *file = 0, const char *anchor = 0)
     { foreach<bool,const char *,const char *,const char *,const char*>
              (&IndexIntf::addContentsItem,isDir,name,ref,file,anchor); }
-    void addIndexItem(Definition *context,MemberDef *md,
-                      const char *anchor=0,const char *word=0)
+    void addIndexItem(Definition *context,MemberDef *md,const char *title=0)
     { foreach<Definition *,MemberDef *>
-             (&IndexIntf::addIndexItem,context,md,anchor,word); }
+             (&IndexIntf::addIndexItem,context,md,title); }
     void addIndexFile(const char *name) 
     { foreach<const char *>(&IndexIntf::addIndexFile,name); }
     void addImageFile(const char *name) 
diff --git a/src/lang_cfg.h b/src/lang_cfg.h
index 34d2ac9..99be35e 100644
--- a/src/lang_cfg.h
+++ b/src/lang_cfg.h
@@ -20,6 +20,7 @@
 #define LANG_SI
 #define LANG_CN
 #define LANG_NO
+#define LANG_MK
 #define LANG_BR
 #define LANG_DK
 #define LANG_SK
@@ -32,6 +33,7 @@
 #define LANG_ZA
 #define LANG_AR
 #define LANG_FA
+#define LANG_SC
 #define LANG_VI
 #define LANG_TR
 #define LANG_EO
diff --git a/src/lodepng.h b/src/lodepng.h
index a86ab65..bbf40dc 100644
--- a/src/lodepng.h
+++ b/src/lodepng.h
@@ -1038,8 +1038,8 @@ in the Decoder's interface in the C++ version.
 
 getBpp():          bits per pixel of the PNG image
 getChannels():     amount of color channels of the PNG image
-isGreyscaleType(): it's color type 0 or 4
-isAlphaType():     it's color type 2 or 6
+isGreyscaleType(): its color type 0 or 4
+isAlphaType():     its color type 2 or 6
 
 These values are calculated out of color type and bit depth of InfoColor.
 
diff --git a/src/memberdef.cpp b/src/memberdef.cpp
index aadb796..f221dd6 100644
--- a/src/memberdef.cpp
+++ b/src/memberdef.cpp
@@ -277,7 +277,7 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd,
   ol.pushGeneratorState();
   ol.disable(OutputGenerator::Html);
   ol.disable(OutputGenerator::Latex);
-  //if (!first) ol.writeString("&nbsp;");
+  //if (!first) ol.writeString("&#160;");
   if (!md->isObjCMethod()) ol.docify(")"); // end argument list
   ol.enableAll();
   if (htmlOn) ol.enable(OutputGenerator::Html);
@@ -2392,7 +2392,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
           "warning: parameters of member %s are not (all) documented",
           qPrint(qualifiedName()));
     }
-    if (!hasDocumentedReturnType() && !isDefine() && hasDocumentation())
+    if (!hasDocumentedReturnType() && isFunction() && hasDocumentation())
     {
       warn_doc_error(docFile(),docLine(),
           "warning: return type of member %s is not documented",
@@ -2807,6 +2807,13 @@ void MemberDef::_computeIsConstructor()
       m_isConstructorCached = name()=="__construct" ? 2 : 1;
       return;
     }
+    else if (name()=="__init__" && m_impl->fileDef &&
+             getLanguageFromFileName(m_impl->fileDef->name())==SrcLangExt_Python) 
+               // for Python
+    {
+      m_isConstructorCached=2; // TRUE
+      return;
+    }
     else // for other languages
     {
       QCString locName = m_impl->classDef->localName();
@@ -2849,6 +2856,12 @@ void MemberDef::_computeIsDestructor()
   {                // for PHP
     isDestructor = name()=="__destruct";
   }
+  else if (name()=="__del__" && m_impl->fileDef &&
+           getLanguageFromFileName(m_impl->fileDef->name())==SrcLangExt_Python) 
+               // for Python
+  {
+    isDestructor=TRUE;
+  }
   else // other languages
   {
     isDestructor =
@@ -2943,7 +2956,7 @@ void MemberDef::writeEnumDeclaration(OutputList &typeDecl,
             typeDecl.enable(OutputGenerator::Latex);
             typeDecl.lineBreak(); 
             typeDecl.disable(OutputGenerator::Latex);
-            typeDecl.writeString("&nbsp;&nbsp;");
+            typeDecl.writeString("&#160;&#160;");
             typeDecl.popGeneratorState();
           }
 
diff --git a/src/membergroup.cpp b/src/membergroup.cpp
index 6c0b81a..6b40e5c 100644
--- a/src/membergroup.cpp
+++ b/src/membergroup.cpp
@@ -58,7 +58,6 @@ MemberGroup::MemberGroup(Definition *parent,
   m_parent        = parent;
   m_docFile       = docFile;
   m_xrefListItems = 0;
-  doc.prepend("<a name=\""+anchor()+"\"></a>");
   //printf("Member group docs=`%s'\n",doc.data());
 }
 
@@ -109,7 +108,9 @@ void MemberGroup::writeDeclarations(OutputList &ol,
                ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd)
 {
   //printf("MemberGroup::writeDeclarations() memberList->count()=%d\n",memberList->count());
-  memberList->writeDeclarations(ol,cd,nd,fd,gd,grpHeader,doc/*,TRUE,TRUE*/);
+  QCString ldoc = doc;
+  if (!ldoc.isEmpty()) ldoc.prepend("<a name=\""+anchor()+"\"></a>");
+  memberList->writeDeclarations(ol,cd,nd,fd,gd,grpHeader,ldoc/*,TRUE,TRUE*/);
 }
 
 void MemberGroup::writePlainDeclarations(OutputList &ol,
diff --git a/src/pagedef.cpp b/src/pagedef.cpp
index 607fa1d..02d6006 100644
--- a/src/pagedef.cpp
+++ b/src/pagedef.cpp
@@ -159,7 +159,7 @@ void PageDef::writeDocumentation(OutputList &ol)
     }
   }
 
-  Doxygen::indexList.addIndexItem(this,0,0,filterTitle(title()));
+  Doxygen::indexList.addIndexItem(this,0,filterTitle(title()));
 }
 
 void PageDef::writePageDocumentation(OutputList &ol)
diff --git a/src/pre.l b/src/pre.l
index c171af0..60446df 100644
--- a/src/pre.l
+++ b/src/pre.l
@@ -84,6 +84,7 @@ static QCString           g_defName;
 static QCString           g_defText;
 static QCString           g_defLitText;
 static QCString           g_defArgsStr;
+static QCString           g_defExtraSpacing;
 static bool               g_defVarArgs;
 static int                g_level;
 static int                g_lastCContext;
@@ -944,6 +945,34 @@ QCString removeIdsAndMarkers(const char *s)
 	result+="0L";
 	p++;
 	while ((c=*p) && isId(c)) p++;
+	if (*p=='(') // undefined function macro
+	{
+	  p++;
+	  int count=1;
+	  while ((c=*p++))
+	  {
+	    if (c=='(') count++;
+	    else if (c==')')
+	    {
+	      count--;
+	      if (count==0) break;
+	    }
+	    else if (c=='/')
+	    {
+	      char pc=c;
+	      c=*++p;
+	      if (c=='*') // start of C comment
+	      {
+		while (*p && !(pc=='*' && c=='/')) // search end of comment
+		{
+		  pc=c;
+		  c=*++p;
+		}
+		p++;
+	      }
+	    }
+	  }
+	}
       }
       else if (c=='/') // skip C comments
       {
@@ -1201,6 +1230,13 @@ static void readIncludeFile(const QCString &inc)
     // extract include path+name
     QCString incFileName=inc.mid(s,i-s).stripWhiteSpace();
 
+    QCString dosExt = incFileName.right(4);
+    if (dosExt==".exe" || dosExt==".dll" || dosExt==".tbl")
+    {
+      // skip imported binary files (e.g. M$ type libraries)
+      return;
+    }
+
     QCString oldFileName = g_yyFileName;
     FileDef *oldFileDef  = g_yyFileDef;
     int oldLineNr        = g_yyLineNr;
@@ -1254,8 +1290,14 @@ static void readIncludeFile(const QCString &inc)
       if (oldFileDef)
       {
 	bool ambig;
+	if (QDir::isRelativePath(incFileName))
+	{
+	  QString absPath = QDir::cleanDirPath(oldFileDef->getPath()+"/"+incFileName);
+	  //printf("%s + %s -> resolved path %s\n",oldFileDef->getPath().data(),incFileName.data(),absPath.data());
+	  incFileName = absPath;
+	}
 	FileDef *fd = findFileDef(Doxygen::inputNameDict,incFileName,ambig);
-	//printf("findFileDef(%s)=%p\n",incFileName.data(),fd);
+	//printf("%s::findFileDef(%s)=%p\n",oldFileDef->name().data(),incFileName.data(),fd);
 	// add include dependency to the file in which the #include was found
 	oldFileDef->addIncludeDependency(fd,incFileName,localInclude,g_isImported);
 	// add included by dependency
@@ -1302,6 +1344,15 @@ static void endCondSection()
   }
 }
 
+static void forceEndCondSection()
+{
+  while (!g_condStack.isEmpty())
+  {
+    g_condStack.pop();
+  }
+  g_skip=FALSE;
+}
+
 static QCString escapeAt(const char *text)
 {
   QCString result;
@@ -1879,7 +1930,7 @@ CHARLIT   (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
 					}
 <EndImport>.				{
   					}
-<DefName>{ID}/"("			{ // define with argument
+<DefName>{ID}/("\\\n")*"("		{ // define with argument
   					  //printf("Define() `%s'\n",yytext);
 					  g_argDict = new QDict<int>(31);
 					  g_argDict->setAutoDelete(TRUE);
@@ -1889,6 +1940,7 @@ CHARLIT   (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
 					  g_defLitText.resize(0);
 					  g_defName = yytext;
 					  g_defVarArgs = FALSE;
+					  g_defExtraSpacing.resize(0);
 					  BEGIN(DefineArg);
   					}
 <DefName>{ID}{B}+"1"			{ // special case: define with 1 -> can be "guard"
@@ -1959,11 +2011,15 @@ CHARLIT   (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
 					  }
 					  g_expectGuard=FALSE;
   					}
+<DefineArg>"\\\n"                       {
+  					  g_defExtraSpacing+="\n";
+					  g_yyLineNr++;
+                                        }
 <DefineArg>","{B}*			{ g_defArgsStr+=yytext; }
 <DefineArg>"("{B}*                      { g_defArgsStr+=yytext; }
 <DefineArg>{B}*")"{B}*			{
                                           g_defArgsStr+=yytext; 
-					  QCString tmp=(QCString)"#define "+g_defName+g_defArgsStr;
+					  QCString tmp=(QCString)"#define "+g_defName+g_defArgsStr+g_defExtraSpacing;
 					  outputArray(tmp.data(),tmp.length());
 					  g_quoteArg=FALSE;
 					  g_insideComment=FALSE;
@@ -2573,6 +2629,9 @@ void preprocessFile(const char *fileName,BufStr &input,BufStr &output)
   preYYlex();
   g_lexInit=TRUE;
 
+  // make sure we don't extend a \cond with missing \endcond over multiple files (see bug 624829)
+  forceEndCondSection();
+
   if (Debug::isFlagSet(Debug::Preprocessor))
   {
     char *orgPos=output.data()+orgOffset;
diff --git a/src/pycode.l b/src/pycode.l
index 79157a6..116219a 100644
--- a/src/pycode.l
+++ b/src/pycode.l
@@ -1336,6 +1336,10 @@ TARGET           ({IDENTIFIER}|"("{TARGET_LIST}")"|"["{TARGET_LIST}"]"|{ATTRIBUT
 				 BEGIN(Body);
                                }
 
+<*>[ \t]+                      {
+  		                 codify(yytext);
+				 BEGIN(Body);					
+  			       }
 <*>.                           {
   		                 codify(yytext);
 				 // printf("[pycode] '%s' [ state %d ]  [line %d] no match\n",
diff --git a/src/pyscanner.l b/src/pyscanner.l
index 24b2672..d47b00e 100644
--- a/src/pyscanner.l
+++ b/src/pyscanner.l
@@ -331,11 +331,11 @@ static void handleCommentBlock(const QCString &doc,bool brief)
 
 }
 
-static void endOfDef()
+static void endOfDef(int correction=0)
 {
   if (bodyEntry)
   {
-    bodyEntry->endBodyLine  = yyLineNr;
+    bodyEntry->endBodyLine  = yyLineNr-correction;
     bodyEntry = 0;
   }
   newEntry();
@@ -379,6 +379,34 @@ static void initSpecialBlock()
   startCommentBlock(TRUE);
 }
 
+static void searchFoundDef()
+{
+  current->fileName  = yyFileName;
+  current->startLine = yyLineNr;
+  current->bodyLine  = yyLineNr;
+  current->section = Entry::FUNCTION_SEC;
+  current->protection = protection = Public;
+  current->lang = SrcLangExt_Python;
+  current->virt = Normal;
+  current->stat = FALSE;
+  current->mtype = mtype = Method;
+  current->type.resize(0);
+  current->name.resize(0);
+  current->args.resize(0);
+  current->argList->clear();
+  g_packageCommentAllowed = FALSE;
+}
+
+static void searchFoundClass()
+{
+  current->section = Entry::CLASS_SEC;
+  current->argList->clear();
+  current->type += "class" ;
+  current->fileName  = yyFileName;
+  current->bodyLine  = yyLineNr;
+  g_packageCommentAllowed = FALSE;
+}
+
 //-----------------------------------------------------------------------------
 /* ----------------------------------------------------------------- */
 #undef	YY_INPUT
@@ -438,9 +466,9 @@ STRINGLITERAL     {STRINGPREFIX}?( {SHORTSTRING} | {LONGSTRING})
 STRINGPREFIX      ("r"|"u"|"ur"|"R"|"U"|"UR"|"Ur"|"uR")
 KEYWORD           ("lambda"|"import"|"class"|"assert"|"as"|"from"|"global"|"def"|"True"|"False")
 FLOWKW            ("or"|"and"|"is"|"not"|"print"|"for"|"in"|"if"|"try"|"except"|"yield"|"raise"|"break"|"continue"|"pass"|"if"|"return"|"while"|"elif"|"else"|"finally")
-POUNDCOMMENT      {B}"#"[^#\n][^\n]* 
+POUNDCOMMENT      "#"[^#\n][^\n]* 
 
-STARTDOCSYMS      ^{B}"##"/[^#]
+STARTDOCSYMS      "##"
 
 %option noyywrap
 
@@ -493,36 +521,23 @@ STARTDOCSYMS      ^{B}"##"/[^#]
 
 <Search>{
 
-    ^{B}"def"{BB}       |
-    "def"{BB}           { // start of a function/method definition
+    ^{B}"def"{BB}       { // start of a function/method definition with indent
       			  g_indent=computeIndent(yytext);
-			  current->fileName  = yyFileName;
-			  current->startLine = yyLineNr;
-			  current->bodyLine  = yyLineNr;
-			  current->section = Entry::FUNCTION_SEC;
-			  current->protection = protection = Public;
-			  current->lang = SrcLangExt_Python;
-			  current->virt = Normal;
-			  current->stat = FALSE;
-			  current->mtype = mtype = Method;
-			  current->type.resize(0);
-			  current->name.resize(0);
-			  current->args.resize(0);
-			  current->argList->clear();
-			  g_packageCommentAllowed = FALSE;
+			  searchFoundDef();
 			  BEGIN( FunctionDec );
-                       }
+      			}
+    "def"{BB}           { // start of a function/method definition
+			  searchFoundDef();
+			  BEGIN( FunctionDec );
+                        }
 
-     ^{B}"class"{BB}	|
-     "class"{BB}        {  // start of a class definition
+     ^{B}"class"{BB}	{ // start of a class definition with indent
       			  g_indent=computeIndent(yytext);
-			  current->section = Entry::CLASS_SEC;
-			  current->argList->clear();
-			  current->type += "class" ;
-			  current->fileName  = yyFileName;
-			  current->bodyLine  = yyLineNr;
-			  g_packageCommentAllowed = FALSE;
-
+			  searchFoundClass();
+			  BEGIN( ClassDec ) ;
+       			}
+     "class"{BB}        {  // start of a class definition
+			  searchFoundClass();
 			  BEGIN( ClassDec ) ;
                        }
      ^{B}"from"{BB}    |
@@ -578,11 +593,6 @@ STARTDOCSYMS      ^{B}"##"/[^#]
     ^{BB}	      {
       			g_curIndent=computeIndent(yytext);
                       }
-    [^\n]             { // any other character...
-                        // This is the major default
-                        // that should catch everything
-                        // else in Body.
-                      }
 
     {NEWLINE}+        { // new line
                         lineCount();
@@ -598,11 +608,17 @@ STARTDOCSYMS      ^{B}"##"/[^#]
 			BEGIN(TripleComment);
                       }
 
-    {STARTDOCSYMS}    {  // start of a special comment
+    {STARTDOCSYMS}/[^#]    {  // start of a special comment
+      			g_curIndent=computeIndent(yytext);
 			g_packageCommentAllowed = FALSE;
 			initSpecialBlock();
 			BEGIN(SpecialComment);
                       }
+    [^\n]             { // any other character...
+                        // This is the major default
+                        // that should catch everything
+                        // else in Body.
+                      }
 }
 
 <FromMod>{
@@ -711,7 +727,7 @@ STARTDOCSYMS      ^{B}"##"/[^#]
 			BEGIN(TripleComment);
                       }
 
-    {STARTDOCSYMS}    {  // start of a special comment
+    {STARTDOCSYMS}/[^#]    {  // start of a special comment
 			initSpecialBlock();
 			BEGIN(SpecialComment);
                       }
@@ -728,6 +744,8 @@ STARTDOCSYMS      ^{B}"##"/[^#]
                         BEGIN( DoubleQuoteString );
                       }
     \n		      { yyLineNr++; }
+    {IDENTIFIER}      // identifiers
+    [^'"\.#a-z_A-Z]+  // other uninteresting stuff
     .                 // anything else
 }
 
@@ -742,7 +760,7 @@ STARTDOCSYMS      ^{B}"##"/[^#]
 			    unput(yytext[i]);
 			  }
 			  endOfDef();
-			  YY_CURRENT_BUFFER->yy_at_bol=TRUE;
+			  //YY_CURRENT_BUFFER->yy_at_bol=TRUE;
                           BEGIN(Search);
 			}
 			else
@@ -760,7 +778,7 @@ STARTDOCSYMS      ^{B}"##"/[^#]
 			    unput(yytext[i]);
 			  }
 			  endOfDef();
-			  YY_CURRENT_BUFFER->yy_at_bol=TRUE;
+			  //YY_CURRENT_BUFFER->yy_at_bol=TRUE;
                           BEGIN(Search);
 			}
 			else
@@ -782,7 +800,7 @@ STARTDOCSYMS      ^{B}"##"/[^#]
                         if (g_curIndent<=g_indent) 
 			  // jumped out of the function
 			{
-			  endOfDef();
+			  endOfDef(1);
                           BEGIN(Search);
 			}
       		      }
@@ -830,7 +848,7 @@ STARTDOCSYMS      ^{B}"##"/[^#]
 			BEGIN(TripleComment);
                       }
 
-    {STARTDOCSYMS}    {  // start of a special comment
+    {STARTDOCSYMS}/[^#]  {  // start of a special comment
 			initSpecialBlock();
 			BEGIN(SpecialComment);
                       }
@@ -931,14 +949,14 @@ STARTDOCSYMS      ^{B}"##"/[^#]
                         yyLineNr++;
 			endOfDef();
 			g_hideClassDocs = FALSE;
-			YY_CURRENT_BUFFER->yy_at_bol=TRUE;
+			//YY_CURRENT_BUFFER->yy_at_bol=TRUE;
                         BEGIN(Search);
                       }
-    \n/"##"           {  // start of a special comment at indent 0
+    \n/"##"[^#]       {  // start of a special comment at indent 0
                         yyLineNr++;
 			endOfDef();
 			g_hideClassDocs = FALSE;
-			YY_CURRENT_BUFFER->yy_at_bol=TRUE;
+			//YY_CURRENT_BUFFER->yy_at_bol=TRUE;
                         BEGIN(Search);
                       }
     ^{BB}/\n	      { // skip empty line
@@ -952,12 +970,12 @@ STARTDOCSYMS      ^{B}"##"/[^#]
                         g_curIndent=computeIndent(yytext);
 			//fprintf(stderr,"g_curIndent=%d g_indent=%d\n",g_curIndent,g_indent);
                         if (g_curIndent<=g_indent) 
-			  // jumped out of the class
+			  // jumped out of the class/method
 			{
-			  endOfDef();
+			  endOfDef(1);
 			  g_indent=g_curIndent;
 			  // make sure the next rule matches ^...
-			  YY_CURRENT_BUFFER->yy_at_bol=TRUE;
+			  //YY_CURRENT_BUFFER->yy_at_bol=TRUE;
 			  g_hideClassDocs = FALSE;
                           BEGIN(Search);
 			}
diff --git a/src/qhp.cpp b/src/qhp.cpp
index f38cf39..0f3e3ad 100644
--- a/src/qhp.cpp
+++ b/src/qhp.cpp
@@ -188,9 +188,8 @@ void Qhp::addContentsItem(bool /*isDir*/, const char * name,
 }
 
 void Qhp::addIndexItem(Definition *context,MemberDef *md,
-                       const char *anc,const char *word)
+                       const char *word)
 {
-  (void)anc;
   (void)word;
 
   if (md) // member
@@ -209,7 +208,7 @@ void Qhp::addIndexItem(Definition *context,MemberDef *md,
     QCString level1  = context->name();
     QCString level2  = word ? QCString(word) : md->name();
     QCString contRef = separateMemberPages ? cfname : cfiname;
-    QCString anchor  = anc;
+    QCString anchor  = md->anchor();
 
     QCString ref;
 
@@ -230,15 +229,7 @@ void Qhp::addIndexItem(Definition *context,MemberDef *md,
     // <keyword name="Foo" id="Foo" ref="doc.html"/>
     QCString contRef = context->getOutputFileBase();
     QCString level1  = word ? QCString(word) : context->name();
-    QCString ref;
-    if (anc)
-    {
-      ref = makeRef(contRef,anc);
-    }
-    else
-    {
-      ref = makeFileName(contRef);
-    }
+    QCString ref = makeFileName(contRef);
     const char * attributes[] =
     {
       "name", level1,
diff --git a/src/qhp.h b/src/qhp.h
index 1ba2e94..e5b4a08 100644
--- a/src/qhp.h
+++ b/src/qhp.h
@@ -33,11 +33,7 @@ class Qhp : public IndexIntf
     void decContentsDepth();
     void addContentsItem(bool isDir, const char * name, const char * ref,
                          const char * file, const char * anchor);
-    //void addIndexItem(const char * level1, const char * level2,
-    //                  const char * contRef, const char * memRef, 
-    //                  const char * anchor, const MemberDef * md);
-    void addIndexItem(Definition *context,MemberDef *md,
-                      const char *anchor,const char *word);
+    void addIndexItem(Definition *context,MemberDef *md,const char *title);
     void addIndexFile(const char * name);
     void addImageFile(const char * name);
     void addStyleSheetFile(const char * name);
diff --git a/src/scanner.l b/src/scanner.l
index 732dfbc..3685157 100644
--- a/src/scanner.l
+++ b/src/scanner.l
@@ -218,6 +218,7 @@ static void initEntry()
   current->virt       = virt;
   current->stat       = gstat;
   current->lang       = language;
+  //printf("*** initEntry() language=%d\n",language);
   //if (!autoGroupStack.isEmpty())
   //{
   //  //printf("Appending group %s\n",autoGroupStack.top()->groupname.data());
@@ -1782,6 +1783,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?)
 					  // *currentTemplateSpec+='>';
 					  if (--sharpCount<=0)
 					  {
+					    current->bodyLine = yyLineNr;
 					    current->args = "(";
 					    currentArgumentContext = FuncQual;
 					    fullArgString = current->args.copy();
@@ -2153,7 +2155,10 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?)
 					  }
   					}
 <FindMembers>[*&]+			{ 
-                                          current->name += yytext ;  
+  					  if (current->type.stripWhiteSpace().right(1)!=yytext)
+					  {
+                                            current->name += yytext ;  
+					  }
   					  addType( current );
 					}
 <FindMembers,MemberSpec,Function,NextSemi,BitFields,ReadInitializer,OldStyleArgs>";"{BN}*("/**"|"//!"|"/*!"|"///")"<" {
@@ -2714,6 +2719,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?)
 					    if (needNewCurrent)
 					    {
 					      current = new Entry(*current);
+					      initEntry();
 					    }
 					    current->name.resize(0);
 					    current->args.resize(0);
@@ -3078,8 +3084,12 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?)
 						}
 						else
 						{
-						  //current->doc.resize(0);
-						  //current->brief.resize(0);
+						  if (!isTypedef)
+						  {
+						    // enabled the next two lines for bug 623424
+						    current->doc.resize(0);
+						    current->brief.resize(0);
+						  }
 						  BEGIN( MemberSpec ) ;
 						}
 					      }
@@ -3142,6 +3152,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?)
 					  current_root->addSubEntry( current ) ;
 					  memspecEntry = current;
 					  current = new Entry(*current);
+					  initEntry();
 					  unput(';');
 					  BEGIN( MemberSpec ) ;
   					}
@@ -3234,6 +3245,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?)
 					    else // case 2: create a typedef field
 					    {
 					      Entry *varEntry=new Entry;
+					      varEntry->lang = language;
 					      varEntry->protection = current->protection ;
 					      varEntry->mtype = current->mtype;
 					      varEntry->virt = current->virt;
@@ -3288,8 +3300,19 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?)
 					      current_root->addSubEntry(varEntry);
 					    }
 					  }
-					  if (*yytext==';')
+					  if (*yytext==';') // end of a struct/class ...
 					  {
+					    if (msName.isEmpty() && memspecEntry && (current->section&Entry::COMPOUND_MASK))
+					    { // case where a class/struct has a doc block after it
+					      if (!current->doc.isEmpty())
+					      {
+					        memspecEntry->doc += current->doc;
+					      }
+					      if (!current->brief.isEmpty())
+					      {
+					        memspecEntry->brief += current->brief;
+					      }
+				  	    }
 					    msType.resize(0);
 					    msName.resize(0);
 					    msArgs.resize(0);
@@ -3335,7 +3358,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?)
 <ReadBody,ReadNSBody,ReadBodyIntf>.	{ current->program += yytext ; }
 
 <FindMembers>"("/{BN}*"::"*{BN}*({TSCOPE}{BN}*"::")*{TSCOPE}{BN}*")"{BN}*"(" | /* typedef void (A<int>::func_t)(args...) */
-<FindMembers>("("({BN}*"::"*{BN}*{TSCOPE}{BN}*"::")*({BN}*[*&]{BN}*)+)+ {   /* typedef void (A::*ptr_t)(args...) or int (*func(int))[] */
+<FindMembers>("("({BN}*"::"*{BN}*{TSCOPE}{BN}*"::")*({BN}*[*&\^]{BN}*)+)+ {   /* typedef void (A::*ptr_t)(args...) or int (*func(int))[], the ^ is for Obj-C blocks */
   					  if (insidePHP) // reference parameter
 					  {
 					    REJECT
@@ -5446,7 +5469,7 @@ static void handleCommentBlock(const QCString &doc,bool brief)
   int position=0;
   bool needsEntry=FALSE;
   if (docBlockInBody && hideInBodyDocs) return;
-  //printf("parseCommentBlock [%s]\n",doc.data());
+  //printf("parseCommentBlock [%s] brief=%d\n",doc.data(),brief);
   int lineNr = brief ? current->briefLine : current->docLine;   // line of block start
   while (parseCommentBlock(
 	g_thisParser,
@@ -5454,9 +5477,9 @@ static void handleCommentBlock(const QCString &doc,bool brief)
 	doc,        // text
 	yyFileName, // file
 	lineNr,     // line of block start
-	docBlockInBody ? FALSE : brief, 
-	docBlockInBody ? FALSE : docBlockAutoBrief,
-	docBlockInBody,
+	docBlockInBody ? FALSE : brief,               // isBrief
+	docBlockInBody ? FALSE : docBlockAutoBrief,   // isJavaDocStyle
+	docBlockInBody,                               // isInBody
 	protection,
         position,
         needsEntry
@@ -5568,6 +5591,7 @@ static void parseCompounds(Entry *rt)
       //current->reset();
       if (current) delete current;
       current = new Entry;
+      current->lang = language;
       gstat = FALSE;
       int ni=ce->name.findRev("::"); if (ni==-1) ni=0; else ni+=2;
       // set default protection based on the compound type
@@ -5667,6 +5691,7 @@ static void parseMain(const char *fileName,const char *fileBuf,Entry *rt)
     yyLineNr= 1 ; 
     yyFileName = fileName;
     setContext();
+    rt->lang = language;
     msg("Parsing file %s...\n",yyFileName.data());
 
     current_root  = rt ;
@@ -5710,7 +5735,12 @@ static void parseMain(const char *fileName,const char *fileBuf,Entry *rt)
     //}
 
     rt->program.resize(0);
-    delete current; current=0;
+    if (rt->children()->contains(current)==0) 
+      // it could be that current is already added as a child to rt, so we
+      // only delete it if this is not the case. See bug 635317.
+    {
+      delete current; current=0;
+    }
 
     parseCompounds(rt);
 
diff --git a/src/search.js b/src/search.js
index a173d64..010fd4b 100644
--- a/src/search.js
+++ b/src/search.js
@@ -244,7 +244,7 @@ function SearchBox(name, resultsPath, inFrame, label)
         }
         else
         {
-          node.innerHTML='&nbsp;';
+          node.innerHTML='&#160;';
         }
         j++;
       }
diff --git a/src/search.php b/src/search.php
index d899ade..bddb487 100644
--- a/src/search.php
+++ b/src/search.php
@@ -279,7 +279,7 @@ function main()
     $query=$_GET["query"];
   }
   end_form(preg_replace("/[^a-zA-Z0-9\-\_\.]/i", " ", $query ));
-  echo "&nbsp;\n<div class=\"searchresults\">\n";
+  echo "&#160;\n<div class=\"searchresults\">\n";
   $results = array();
   $requiredWords = array();
   $forbiddenWords = array();
diff --git a/src/search_js.h b/src/search_js.h
index 7bc4f16..d8ef087 100644
--- a/src/search_js.h
+++ b/src/search_js.h
@@ -244,7 +244,7 @@
 "        }\n"
 "        else\n"
 "        {\n"
-"          node.innerHTML='&nbsp;';\n"
+"          node.innerHTML='&#160;';\n"
 "        }\n"
 "        j++;\n"
 "      }\n"
diff --git a/src/search_php.h b/src/search_php.h
index 9cb3f20..3380cee 100644
--- a/src/search_php.h
+++ b/src/search_php.h
@@ -279,7 +279,7 @@
 "    $query=$_GET[\"query\"];\n"
 "  }\n"
 "  end_form(preg_replace(\"/[^a-zA-Z0-9\\-\\_\\.]/i\", \" \", $query ));\n"
-"  echo \"&nbsp;\\n<div class=\\\"searchresults\\\">\\n\";\n"
+"  echo \"&#160;\\n<div class=\\\"searchresults\\\">\\n\";\n"
 "  $results = array();\n"
 "  $requiredWords = array();\n"
 "  $forbiddenWords = array();\n"
diff --git a/src/translator_es.h b/src/translator_es.h
index 3737578..077314a 100644
--- a/src/translator_es.h
+++ b/src/translator_es.h
@@ -1,4 +1,4 @@
-/******************************************************************************
+﻿/******************************************************************************
  *
  * 
  *
@@ -25,7 +25,7 @@
  * Updated to 1.5.5 by Bartomeu Creus Navarro (5-febrero-2008)
  * Updated to 1.5.8 by Bartomeu Creus Navarro (10-abril-2009)
  * Updated to 1.6.3 by Bartomeu Creus Navarro (3-marzo-2010)
- * Updated to 1.6.4 by Bartomeu Creus Navarro (26-mayo-2010)
+ * Updated to 1.6.4 by Bartomeu Creus Navarro (26-mayo-2010) [(16-jun-2010) grabado en UTF-8]
  */
 
 #ifndef TRANSLATOR_ES_H
@@ -84,36 +84,36 @@ class TranslatorSpanish : public Translator
 
     /*! header that is put before the detailed description of files, classes and namespaces. */
     virtual QCString trDetailedDescription()
-    { return "Descripci�n detallada"; }
+    { return "Descripción detallada"; }
 
     /*! header that is put before the list of typedefs. */
     virtual QCString trMemberTypedefDocumentation()
-    { return "Documentaci�n de los 'Typedef' miembros de la clase"; }
+    { return "Documentación de los 'Typedef' miembros de la clase"; }
     
     /*! header that is put before the list of enumerations. */
     virtual QCString trMemberEnumerationDocumentation()
-    { return "Documentaci�n de las enumeraciones miembro de la clase"; }
+    { return "Documentación de las enumeraciones miembro de la clase"; }
     
     /*! header that is put before the list of member functions. */
     virtual QCString trMemberFunctionDocumentation()
-    { return "Documentaci�n de las funciones miembro"; }
+    { return "Documentación de las funciones miembro"; }
     
     /*! header that is put before the list of member attributes. */
     virtual QCString trMemberDataDocumentation()
     { 
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        return "Documentaci�n de los campos"; 
+        return "Documentación de los campos"; 
       }
       else
       {
-        return "Documentaci�n de los datos miembro"; 
+        return "Documentación de los datos miembro"; 
       }
     }
 
     /*! this is the text of a link put after brief descriptions. */
     virtual QCString trMore() 
-    { return "M�s..."; }
+    { return "Más..."; }
 
     /*! put in the class documentation */
     virtual QCString trListOfAllMembers()
@@ -135,15 +135,15 @@ class TranslatorSpanish : public Translator
      *  parameter s is name of the project name.
      */
     virtual QCString trGeneratedAutomatically(const char *s)
-    { QCString result="Generado autom�ticamente por Doxygen";
+    { QCString result="Generado automáticamente por Doxygen";
       if (s) result+=(QCString)" para "+s;
-      result+=" del c�digo fuente."; 
+      result+=" del código fuente."; 
       return result;
     }
 
     /*! put after an enum name in the list of all members */
     virtual QCString trEnumName()
-    { return "nombre de la enumeraci�n"; }
+    { return "nombre de la enumeración"; }
     
     /*! put after an enum value in the list of all members */
     virtual QCString trEnumValue()
@@ -159,11 +159,11 @@ class TranslatorSpanish : public Translator
      *  compounds or files (see the \\group command).
      */
     virtual QCString trModules()
-    { return "M�dulos"; }
+    { return "Módulos"; }
     
     /*! This is put above each page as a link to the class hierarchy */
     virtual QCString trClassHierarchy()
-    { return "Jerarqu�a de la clase"; }
+    { return "Jerarquía de la clase"; }
     
     /*! This is put above each page as a link to the list of annotated classes */
     virtual QCString trCompoundList()
@@ -210,7 +210,7 @@ class TranslatorSpanish : public Translator
 
     /*! This is put above each page as a link to all related pages. */
     virtual QCString trRelatedPages()
-    { return "P�ginas relacionadas"; }
+    { return "Páginas relacionadas"; }
 
     /*! This is put above each page as a link to all examples. */
     virtual QCString trExamples()
@@ -223,7 +223,7 @@ class TranslatorSpanish : public Translator
     /*! This is an introduction to the class hierarchy. */
     virtual QCString trClassHierarchyDescription()
     { return "Esta lista de herencias esta ordenada "
-              "aproximadamente por orden alfab�tico:";
+              "aproximadamente por orden alfabético:";
     }
 
     /*! This is an introduction to the list with all files. */
@@ -240,12 +240,12 @@ class TranslatorSpanish : public Translator
     {
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        return "Lista de estructuras con una breve descripci�n:"; 
+        return "Lista de estructuras con una breve descripción:"; 
       }
       else
       {
        return "Lista de las clases, estructuras, "
-             "uniones e interfaces con una breve descripci�n:"; 
+             "uniones e interfaces con una breve descripción:"; 
       }
     }
 
@@ -270,11 +270,11 @@ class TranslatorSpanish : public Translator
       {
         if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
         {
-          result+="la documentaci�n de la estructura/uni�n para cada campo:";
+          result+="la documentación de la estructura/unión para cada campo:";
         }
         else
         {
-          result+="la documentaci�n de la clase para cada miembro:";
+          result+="la documentación de la clase para cada miembro:";
         }
       }
       else 
@@ -308,7 +308,7 @@ class TranslatorSpanish : public Translator
       if (extractAll) 
         result+="a los ficheros a los que corresponden:";
       else 
-        result+="a la documentaci�n:";
+        result+="a la documentación:";
       return result;
     }
 
@@ -318,29 +318,29 @@ class TranslatorSpanish : public Translator
 
     /*! This is an introduction to the page with the list of related pages */
     virtual QCString trRelatedPagesDescription()
-    { return "Lista de toda la documentaci�n relacionada:"; }
+    { return "Lista de toda la documentación relacionada:"; }
 
     /*! This is an introduction to the page with the list of class/file groups */
     virtual QCString trModulesDescription()
-    { return "Lista de todos los m�dulos:"; }
+    { return "Lista de todos los módulos:"; }
 
     // index titles (the project name is prepended for these) 
 
     /*! This is used in HTML as the title of index.html. */
     virtual QCString trDocumentation()
-    { return "Documentaci�n"; }
+    { return "Documentación"; }
 
     /*! This is used in LaTeX as the title of the chapter with the 
      * index of all groups.
      */
     virtual QCString trModuleIndex()
-    { return "Indice de m�dulos"; }
+    { return "Indice de módulos"; }
 
     /*! This is used in LaTeX as the title of the chapter with the 
      * class hierarchy.
      */
     virtual QCString trHierarchicalIndex()
-    { return "Indice jer�rquico"; }
+    { return "Indice jerárquico"; }
 
     /*! This is used in LaTeX as the title of the chapter with the 
      * annotated compound index.
@@ -349,11 +349,11 @@ class TranslatorSpanish : public Translator
     {
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       { 
-        return "�ndice de estructura de datos";
+        return "Índice de estructura de datos";
       }
       else
       {
-        return "�ndice de clases"; 
+        return "Índice de clases"; 
       }
     }
 
@@ -367,7 +367,7 @@ class TranslatorSpanish : public Translator
      *  the documentation of all groups.
      */
     virtual QCString trModuleDocumentation()
-    { return "Documentaci�n de m�dulos"; }
+    { return "Documentación de módulos"; }
 
     /*! This is used in LaTeX as the title of the chapter containing
      *  the documentation of all classes, structs and unions.
@@ -376,11 +376,11 @@ class TranslatorSpanish : public Translator
     {
       if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
       {
-        return "Documentaci�n de las estructuras de datos";
+        return "Documentación de las estructuras de datos";
       }
       else
       {
-        return "Documentaci�n de las clases"; 
+        return "Documentación de las clases"; 
       }
     }
 
@@ -388,19 +388,19 @@ class TranslatorSpanish : public Translator
      *  the documentation of all files.
      */
     virtual QCString trFileDocumentation()
-    { return "Documentaci�n de archivos"; }
+    { return "Documentación de archivos"; }
 
     /*! This is used in LaTeX as the title of the chapter containing
      *  the documentation of all examples.
      */
     virtual QCString trExampleDocumentation()
-    { return "Documentaci�n de ejemplos"; }
+    { return "Documentación de ejemplos"; }
 
     /*! This is used in LaTeX as the title of the chapter containing
      *  the documentation of all related pages.
      */
     virtual QCString trPageDocumentation()
-    { return "Documentaci�n de p�ginas"; }
+    { return "Documentación de páginas"; }
 
     /*! This is used in LaTeX as the title of the document */
     virtual QCString trReferenceManual()
@@ -452,37 +452,37 @@ class TranslatorSpanish : public Translator
      *  documentation blocks for defines
      */
     virtual QCString trDefineDocumentation()
-    { return "Documentaci�n de los 'defines'"; }
+    { return "Documentación de los 'defines'"; }
 
     /*! This is used in the documentation of a file/namespace before the list 
      *  of documentation blocks for function prototypes
      */
     virtual QCString trFunctionPrototypeDocumentation()
-    { return "Documentaci�n de las funciones prototipo"; }
+    { return "Documentación de las funciones prototipo"; }
 
     /*! This is used in the documentation of a file/namespace before the list 
      *  of documentation blocks for typedefs
      */
     virtual QCString trTypedefDocumentation()
-    { return "Documentaci�n de los 'typedefs'"; }
+    { return "Documentación de los 'typedefs'"; }
 
     /*! This is used in the documentation of a file/namespace before the list 
      *  of documentation blocks for enumeration types
      */
     virtual QCString trEnumerationTypeDocumentation()
-    { return "Documentaci�n de las enumeraciones"; }
+    { return "Documentación de las enumeraciones"; }
 
     /*! This is used in the documentation of a file/namespace before the list 
      *  of documentation blocks for functions
      */
     virtual QCString trFunctionDocumentation()
-    { return "Documentaci�n de las funciones"; }
+    { return "Documentación de las funciones"; }
 
     /*! This is used in the documentation of a file/namespace before the list 
      *  of documentation blocks for variables
      */
     virtual QCString trVariableDocumentation()
-    { return "Documentaci�n de las variables"; }
+    { return "Documentación de las variables"; }
 
     /*! This is used in the documentation of a file/namespace/group before 
      *  the list of links to documented compounds
@@ -525,15 +525,15 @@ class TranslatorSpanish : public Translator
     
     /*! this text is generated when the \\internal command is used. */
     virtual QCString trForInternalUseOnly()
-    { return "S�lo para uso interno."; }
+    { return "Sólo para uso interno."; }
 
     /*! this text is generated when the \\warning command is used. */
     virtual QCString trWarning()
-    { return "Atenci�n"; }
+    { return "Atención"; }
 
     /*! this text is generated when the \\version command is used. */
     virtual QCString trVersion()
-    { return "Versi�n"; }
+    { return "Versión"; }
 
     /*! this text is generated when the \\date command is used. */
     virtual QCString trDate()
@@ -545,11 +545,11 @@ class TranslatorSpanish : public Translator
 
     /*! this text is generated when the \\sa command is used. */
     virtual QCString trSeeAlso()
-    { return "Ver tambi�n"; }
+    { return "Ver también"; }
 
     /*! this text is generated when the \\param command is used. */
     virtual QCString trParameters()
-    { return "Par�metros"; }
+    { return "Parámetros"; }
 
     /*! this text is generated when the \\exception command is used. */
     virtual QCString trExceptions()
@@ -571,8 +571,8 @@ class TranslatorSpanish : public Translator
     virtual QCString trNamespaceListDescription(bool extractAll)
     {
       QCString result="Lista de ";
-      if (!extractAll) result+="toda la documentaci�n de ";
-      result+="los 'namespaces', con una breve descripci�n:";
+      if (!extractAll) result+="toda la documentación de ";
+      result+="los 'namespaces', con una breve descripción:";
       return result;
     }
 
@@ -590,7 +590,7 @@ class TranslatorSpanish : public Translator
      * related classes 
      */
     virtual QCString trRelatedFunctionDocumentation()
-    { return "Documentaci�n de las funciones relacionadas y clases amigas"; }
+    { return "Documentación de las funciones relacionadas y clases amigas"; }
 
 //////////////////////////////////////////////////////////////////////////
 // new since 0.49-990425
@@ -607,11 +607,11 @@ class TranslatorSpanish : public Translator
       {
         case ClassDef::Class:      result+=" la Clase "; break;
         case ClassDef::Struct:     result+=" la Estructura "; break;
-        case ClassDef::Union:      result+=" la Uni�n "; break;
+        case ClassDef::Union:      result+=" la Unión "; break;
         case ClassDef::Interface:  result+=" la Interfaz "; break;
         case ClassDef::Protocol:   result+="l Protocolo "; break;
         case ClassDef::Category:   result+=" la Categoria "; break;
-        case ClassDef::Exception:  result+=" la Excepci�n "; break;
+        case ClassDef::Exception:  result+=" la Excepción "; break;
       }
       result+=(QCString)clName;
       return result;
@@ -634,34 +634,34 @@ class TranslatorSpanish : public Translator
     }
 
     virtual QCString trPublicMembers()
-    { return "M�todos p�blicos"; }
+    { return "Métodos públicos"; }
 
     virtual QCString trPublicSlots()
-    { return "Slots p�blicos"; }
+    { return "Slots públicos"; }
 
     virtual QCString trSignals()
-    { return "Se�ales"; }
+    { return "Señales"; }
 
     virtual QCString trStaticPublicMembers()
-    { return "M�todos p�blicos est�ticos"; }
+    { return "Métodos públicos estáticos"; }
 
     virtual QCString trProtectedMembers()
-    { return "M�todos protegidos"; }
+    { return "Métodos protegidos"; }
 
     virtual QCString trProtectedSlots()
     { return "Slots protegidos"; }
 
     virtual QCString trStaticProtectedMembers()
-    { return "M�todos protegidos est�ticos"; }
+    { return "Métodos protegidos estáticos"; }
 
     virtual QCString trPrivateMembers()
-    { return "M�todos privados"; }
+    { return "Métodos privados"; }
 
     virtual QCString trPrivateSlots()
     { return "Slots privados"; }
 
     virtual QCString trStaticPrivateMembers()
-    { return "M�todos privados est�ticos"; }
+    { return "Métodos privados estáticos"; }
 
     /*! this function is used to produce a comma-separated list of items.
      *  use generateMarker(i) to indicate where item i should be put.
@@ -728,12 +728,12 @@ class TranslatorSpanish : public Translator
     virtual QCString trNamespaceMemberDescription(bool extractAll)
     { 
       QCString result="Lista de ";
-      if (!extractAll) result+="toda la documentaci�n de ";
+      if (!extractAll) result+="toda la documentación de ";
       result+="los miembros del namespace con enlace a ";
       if (extractAll) 
         result+="los namespace de cada miembro:";
       else 
-        result+="la documentaci�n de los namespaces pertenecientes a:";
+        result+="la documentación de los namespaces pertenecientes a:";
       return result;
     }
     /*! This is used in LaTeX as the title of the chapter with the 
@@ -746,7 +746,7 @@ class TranslatorSpanish : public Translator
      *  the documentation of all namespaces.
      */
     virtual QCString trNamespaceDocumentation()
-    { return "Documentaci�n de namespaces"; }
+    { return "Documentación de namespaces"; }
 
 //////////////////////////////////////////////////////////////////////////
 // new since 0.49-990522
@@ -769,16 +769,16 @@ class TranslatorSpanish : public Translator
         bool single)
     { // here s is one of " Class", " Struct" or " Union"
       // single is true implies a single file
-      QCString result=(QCString)"La documentaci�n para est";
+      QCString result=(QCString)"La documentación para est";
       switch(compType)
       {
         case ClassDef::Class:      result+="a clase"; break;
         case ClassDef::Struct:     result+="a estructura"; break;
-        case ClassDef::Union:      result+="a uni�n"; break;
+        case ClassDef::Union:      result+="a unión"; break;
         case ClassDef::Interface:  result+="e interfaz"; break;
         case ClassDef::Protocol:   result+="e protocolo"; break;
-        case ClassDef::Category:   result+="a categor�a"; break;
-        case ClassDef::Exception:  result+="a excepci�n"; break;
+        case ClassDef::Category:   result+="a categoría"; break;
+        case ClassDef::Exception:  result+="a excepción"; break;
       }
       result+=" fue generada a partir de";
       if (single) result+="l siguiente fichero:"; 
@@ -790,7 +790,7 @@ class TranslatorSpanish : public Translator
      * list.
      */
     virtual QCString trAlphabeticalList()
-    { return "Lista alfab�tica"; }
+    { return "Lista alfabética"; }
 
 //////////////////////////////////////////////////////////////////////////
 // new since 0.49-990901
@@ -803,7 +803,7 @@ class TranslatorSpanish : public Translator
     /*! This is in the (quick) index as a link to the main page (index.html)
      */
     virtual QCString trMainPage()
-    { return "P�gina principal"; }
+    { return "Página principal"; }
 
     /*! This is used in references to page that are put in the LaTeX 
      *  documentation. It should be an abbreviation of the word page.
@@ -817,11 +817,11 @@ class TranslatorSpanish : public Translator
 
     virtual QCString trDefinedAtLineInSourceFile()
     {
-      return "Definici�n en la l�nea @0 del archivo @1.";
+      return "Definición en la línea @0 del archivo @1.";
     }
     virtual QCString trDefinedInSourceFile()
     {
-      return "Definici�n en el archivo @0.";
+      return "Definición en el archivo @0.";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -840,43 +840,43 @@ class TranslatorSpanish : public Translator
     /*! this text is put before a collaboration diagram */
     virtual QCString trCollaborationDiagram(const char *clName)
     {
-      return (QCString)"Diagrama de colaboraci�n para "+clName+":";
+      return (QCString)"Diagrama de colaboración para "+clName+":";
     }
 
     /*! this text is put before an include dependency graph */
     virtual QCString trInclDepGraph(const char *fName)
     {
-      return (QCString)"Dependencia gr�fica adjunta para "+fName+":";
+      return (QCString)"Dependencia gráfica adjunta para "+fName+":";
     }
 
     /*! header that is put before the list of constructor/destructors. */
     virtual QCString trConstructorDocumentation()
     {
-      return "Documentaci�n del constructor y destructor"; 
+      return "Documentación del constructor y destructor"; 
     }
 
     /*! Used in the file documentation to point to the corresponding sources. */
     virtual QCString trGotoSourceCode()
     {
-      return "Ir al c�digo fuente de este archivo.";
+      return "Ir al código fuente de este archivo.";
     }
 
     /*! Used in the file sources to point to the corresponding documentation. */
     virtual QCString trGotoDocumentation()
     {
-      return "Ir a la documentaci�n de este archivo.";
+      return "Ir a la documentación de este archivo.";
     }
 
     /*! Text for the \\pre command */
     virtual QCString trPrecondition()
     {
-      return "Precondici�n";
+      return "Precondición";
     }
 
     /*! Text for the \\post command */
     virtual QCString trPostcondition()
     {
-      return "Postcondici�n";
+      return "Postcondición";
     }
 
     /*! Text for the \\invariant command */
@@ -894,27 +894,27 @@ class TranslatorSpanish : public Translator
     /*! Text used the source code in the file index */
     virtual QCString trCode()
     {
-      return "c�digo";
+      return "código";
     }
 
     virtual QCString trGraphicalHierarchy()
     {
-      return "Representaci�n gr�fica de la clase";
+      return "Representación gráfica de la clase";
     }
 
     virtual QCString trGotoGraphicalHierarchy()
     {
-      return "Ir a la representaci�n gr�fica de la jerarqu�a de la clase";
+      return "Ir a la representación gráfica de la jerarquía de la clase";
     }
 
     virtual QCString trGotoTextualHierarchy()
     {
-      return "Ir a la jerarqu�a textual de la clase";
+      return "Ir a la jerarquía textual de la clase";
     }
 
     virtual QCString trPageIndex()
     {
-      return "P�gina indice";
+      return "Página indice";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -928,7 +928,7 @@ class TranslatorSpanish : public Translator
 
     virtual QCString trPublicTypes()
     {
-      return "Tipos p�blicos";
+      return "Tipos públicos";
     }
 
     virtual QCString trPublicAttribs()
@@ -939,13 +939,13 @@ class TranslatorSpanish : public Translator
       }
       else
       {
-        return "Atributos p�blicos";
+        return "Atributos públicos";
       }
     }
 
     virtual QCString trStaticPublicAttribs()
     {
-      return "Atributos p�blicos est�ticos";
+      return "Atributos públicos estáticos";
     }
 
     virtual QCString trProtectedTypes()
@@ -960,7 +960,7 @@ class TranslatorSpanish : public Translator
 
     virtual QCString trStaticProtectedAttribs()
     {
-      return "Atributos protegidos est�ticos";
+      return "Atributos protegidos estáticos";
     }
 
     virtual QCString trPrivateTypes()
@@ -975,7 +975,7 @@ class TranslatorSpanish : public Translator
 
     virtual QCString trStaticPrivateAttribs()
     {
-      return "Atributos privados est�ticos";
+      return "Atributos privados estáticos";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1010,12 +1010,12 @@ class TranslatorSpanish : public Translator
 
     virtual QCString trAttention()
     {
-      return "Atenci�n";
+      return "Atención";
     }
 
     virtual QCString trInclByDepGraph()
     {
-      return "Gr�fico de los archivos que directa o "
+      return "Gráfico de los archivos que directa o "
               "indirectamente incluyen a este archivo:";
     }
 
@@ -1031,7 +1031,7 @@ class TranslatorSpanish : public Translator
     /*! title of the graph legend page */
     QCString trLegendTitle()
     {
-      return "Colores y flechas del Gr�fico";
+      return "Colores y flechas del Gráfico";
     }
 
     /*! page explaining how the dot graph's should be interpreted 
@@ -1040,13 +1040,13 @@ class TranslatorSpanish : public Translator
     virtual QCString trLegendDocs()
     {
       return 
-        "Esta p�gina explica como interpretar los gr�ficos que son generados "
+        "Esta página explica como interpretar los gráficos que son generados "
         "por doxygen.<p>\n"
         "Considere el siguiente ejemplo:\n"
         "\\code\n"
         "/*! Clase invisible por truncamiento */\n"  
         "class Invisible { };\n\n"
-        "/*! Clase truncada, relaci�n de herencia escondida */\n"
+        "/*! Clase truncada, relación de herencia escondida */\n"
         "class Truncated : public Invisible { };\n\n"
         "/* Clase no documentada con comentarios de doxygen */\n"
         "class Undocumented { };\n\n"
@@ -1071,31 +1071,31 @@ class TranslatorSpanish : public Translator
         "    Used *m_usedClass;\n"
         "};\n"
         "\\endcode\n"
-        "Si la etiqueta \\c MAX_DOT_GRAPH_HEIGHT en el archivo de configuraci�n "
-        "tiene valor 240 resultar� en el siguiente gr�fico:"
+        "Si la etiqueta \\c MAX_DOT_GRAPH_HEIGHT en el archivo de configuración "
+        "tiene valor 240 resultará en el siguiente gráfico:"
         "<p><center><img alt=\"\" src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
         "<p>\n"
-        "Las cajas en el gr�fico arriba tienen el siguiente significado:\n"
+        "Las cajas en el gráfico arriba tienen el siguiente significado:\n"
         "<ul>\n"
-        "<li>Una caja llena negra representa la estructura o clase para la cu�l"
-        "se gener� el gr�fico.\n"
-        "<li>Una caja con borde negro se�ala una estructura o clase documentada.\n"
-        "<li>Una caja con borde griz se�ala una estructura o clase no documentada.\n"
-        "<li>una caja con borde rojo se�ala una estructura o clase documentada"
-        " de la cu�l no toda las relaciones de jerarqu�a/contenido son "
-        "mostradas. El gr�fico sera truncado si este no calza dentro de los "
-        "l�mites especificados."
+        "<li>Una caja llena negra representa la estructura o clase para la cuál"
+        "se generó el gráfico.\n"
+        "<li>Una caja con borde negro señala una estructura o clase documentada.\n"
+        "<li>Una caja con borde griz señala una estructura o clase no documentada.\n"
+        "<li>una caja con borde rojo señala una estructura o clase documentada"
+        " de la cuál no toda las relaciones de jerarquía/contenido son "
+        "mostradas. El gráfico sera truncado si este no calza dentro de los "
+        "límites especificados."
         "</ul>\n"
         "Las flechas tienen el siguiente significado:\n"
         "<ul>\n"
-        "<li>Una flecha azul oscuro es usada para visualizar una relaci�n herencia publica entre dos clases.\n"
+        "<li>Una flecha azul oscuro es usada para visualizar una relación herencia publica entre dos clases.\n"
         "<li>Una flecha verde oscuro es usada para herencia protegida.\n"
         "<li>Una flecha rojo oscuro es usada para herencia privada.\n"
-        "<li>Una flecha segmentada p�rpura se usa si la clase es contenida o "
-        "usada por otra clase. La flecha est� etiquetada por la variable "
+        "<li>Una flecha segmentada púrpura se usa si la clase es contenida o "
+        "usada por otra clase. La flecha está etiquetada por la variable "
         "con que se accede a la clase o estructura apuntada. \n"  
-        "<li>Una flecha segmentada amarilla indica la relaci�n entre una instancia template y la clase template de la que se ha instanciado."
-        " La flecha se etiqueta con los par�metros con que se llama al template.\n"
+        "<li>Una flecha segmentada amarilla indica la relación entre una instancia template y la clase template de la que se ha instanciado."
+        " La flecha se etiqueta con los parámetros con que se llama al template.\n"
         "</ul>\n";
     }
 
@@ -1128,7 +1128,7 @@ class TranslatorSpanish : public Translator
     /*! Used as a section header for KDE-2 IDL methods */
     virtual QCString trDCOPMethods()
     {
-      return "M�todos DCOP";
+      return "Métodos DCOP";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1144,7 +1144,7 @@ class TranslatorSpanish : public Translator
     /*! Used as a section header for IDL property documentation */
     virtual QCString trPropertyDocumentation()
     {
-      return "Documentaci�n de propiedades";
+      return "Documentación de propiedades";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1179,7 +1179,7 @@ class TranslatorSpanish : public Translator
     /*! The description of the package index page */
     virtual QCString trPackageListDescription()
     {
-      return "Aqu� van los paquetes con una breve descripci�n (si et� disponible):";
+      return "Aquí van los paquetes con una breve descripción (si etá disponible):";
     }
 
     /*! The link name in the Quick links header for each page */
@@ -1256,7 +1256,7 @@ class TranslatorSpanish : public Translator
     /*! Used as header RTF general index */
     virtual QCString trRTFGeneralIndex()
     {
-      return "�ndice";
+      return "Índice";
     }
 
     /*! This is used for translation of the word that will possibly
@@ -1309,7 +1309,7 @@ class TranslatorSpanish : public Translator
      */
     virtual QCString trPage(bool first_capital, bool singular)
     { 
-      QCString result((first_capital ? "P�gina" : "p�gina"));
+      QCString result((first_capital ? "Página" : "página"));
       if (!singular)  result+="s";
       return result; 
     }
@@ -1419,7 +1419,7 @@ class TranslatorSpanish : public Translator
     /*! Header used for the documentation section of a class' events. */
     virtual QCString trEventDocumentation()
     {
-      return "Documentaci�n de los eventos";
+      return "Documentación de los eventos";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1446,7 +1446,7 @@ class TranslatorSpanish : public Translator
      */
     virtual QCString trStaticPackageMembers()
     { 
-      return "Funciones est�ticas del 'package'";
+      return "Funciones estáticas del 'package'";
     }
 
     /*! Used as a heading for a list of Java class variables with package 
@@ -1462,7 +1462,7 @@ class TranslatorSpanish : public Translator
      */
     virtual QCString trStaticPackageAttribs()
     { 
-      return "Atributos Est�ticos del 'package'";
+      return "Atributos Estáticos del 'package'";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1480,7 +1480,7 @@ class TranslatorSpanish : public Translator
     /*! Put in front of the call graph for a function. */
     virtual QCString trCallGraph()
     {
-      return "Gr�fico de llamadas para esta funci�n:";
+      return "Gráfico de llamadas para esta función:";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1501,7 +1501,7 @@ class TranslatorSpanish : public Translator
      */
     virtual QCString trSearchResultsTitle()
     {
-      return "Resultados de la B�squeda";
+      return "Resultados de la Búsqueda";
     }
 
     /*! This string is put just before listing the search results. The
@@ -1516,15 +1516,15 @@ class TranslatorSpanish : public Translator
     {
       if (numDocuments==0)
       {
-        return "Disculpe, no se encontraron documentos que coincidan con su b�squeda.";
+        return "Disculpe, no se encontraron documentos que coincidan con su búsqueda.";
       }
       else if (numDocuments==1)
       {
-        return "Se encontr� <b>1</b> documento que coincide con su b�squeda.";
+        return "Se encontró <b>1</b> documento que coincide con su búsqueda.";
       }
       else 
       {
-        return "Se encontraron <b>$num</b> documentos que coinciden con su b�squeda. "
+        return "Se encontraron <b>$num</b> documentos que coinciden con su búsqueda. "
                 "Se muestran los mejores resultados primero.";
       }
     }
@@ -1556,13 +1556,13 @@ class TranslatorSpanish : public Translator
      *  hierarchy.
      */
     virtual QCString trDirIndex()
-    { return "Jerarqu�a de directorios"; }
+    { return "Jerarquía de directorios"; }
 
     /*! This is used as the name of the chapter containing the documentation
      *  of the directories.
      */
     virtual QCString trDirDocumentation()
-    { return "Documentaci�n de directorios"; }
+    { return "Documentación de directorios"; }
 
     /*! This is used as the title of the directory index and also in the
      *  Quick links of an HTML page, to link to the directory hierarchy.
@@ -1574,8 +1574,8 @@ class TranslatorSpanish : public Translator
      *  and the fact that it is sorted alphabetically per level
      */
     virtual QCString trDirDescription()
-    { return "La jeraqu�a de este directorio est� ordenada"
-              " alfab�ticamente, de manera aproximada:";
+    { return "La jeraquía de este directorio está ordenada"
+              " alfabéticamente, de manera aproximada:";
     }
 
     /*! This returns the title of a directory page. The name of the
@@ -1607,9 +1607,9 @@ class TranslatorSpanish : public Translator
      */
     virtual QCString trOverloadText()
     {
-       return "Esta es una funci�n miembro sobrecargada que se "
+       return "Esta es una función miembro sobrecargada que se "
                "suministra por conveniencia. Difiere de la anterior "
-               "funci�n solamente en los argumentos que acepta.";
+               "función solamente en los argumentos que acepta.";
     }
 
 //////////////////////////////////////////////////////////////////////////
@@ -1619,28 +1619,28 @@ class TranslatorSpanish : public Translator
     /*! This is used to introduce a caller (or called-by) graph */
     virtual QCString trCallerGraph()
     {
-      return "Gr�fico de llamadas a esta funci�n:";
+      return "Gráfico de llamadas a esta función:";
     }
 
     /*! This is used in the documentation of a file/namespace before the list 
      *  of documentation blocks for enumeration values
      */
     virtual QCString trEnumerationValueDocumentation()
-    { return "Documentaci�n de los valores de la enumeraci�n"; }
+    { return "Documentación de los valores de la enumeración"; }
 
 //////////////////////////////////////////////////////////////////////////
 // new since 1.5.4 (mainly for Fortran)
 //////////////////////////////////////////////////////////////////////////
     // De parte de Bartomeu:
     //    No conozco el Fortran, salvo un par de ejercicios en la universidad
-    // hace muchos a�os. Por lo tanto, las traducciones son del ingl�s
-    // al espa�ol, no de un usuario de Fortran que puede que haya cosas que no
+    // hace muchos años. Por lo tanto, las traducciones son del inglés
+    // al español, no de un usuario de Fortran que puede que haya cosas que no
     // traduzca o traduzca de otra forma. Que los usuarios de Fortran disculpen
-    // y espero se animen a mejorar mi traducci�n.
+    // y espero se animen a mejorar mi traducción.
 
     /*! header that is put before the list of member subprograms (Fortran). */
     virtual QCString trMemberFunctionDocumentationFortran()
-    { return "Documetaci�n de miembros Function/Subroutine"; }
+    { return "Documetación de miembros Function/Subroutine"; }
 
     /*! This is put above each page as a link to the list of annotated data types (Fortran). */    
     virtual QCString trCompoundListFortran()
@@ -1652,12 +1652,12 @@ class TranslatorSpanish : public Translator
 
     /*! This is an introduction to the annotated compound list (Fortran). */
     virtual QCString trCompoundListDescriptionFortran()
-    { return "Aqu� est�n los tipos de datos con una breve descripci�n:"; }
+    { return "Aquí están los tipos de datos con una breve descripción:"; }
 
     /*! This is an introduction to the page with all data types (Fortran). */
     virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
     {
-      QCString result="Aqu� est� una lista de todos ";
+      QCString result="Aquí está una lista de todos ";
       result+="los miembros de los tipos de datos ";
       if (!extractAll)
       {
@@ -1666,7 +1666,7 @@ class TranslatorSpanish : public Translator
       result+="con enlaces a ";
       if (!extractAll) 
       {
-         result+="la documentaci�n de la estructura de datos para cada miembro";
+         result+="la documentación de la estructura de datos para cada miembro";
       }
       else 
       {
@@ -1679,13 +1679,13 @@ class TranslatorSpanish : public Translator
      * annotated compound index (Fortran).
      */
     virtual QCString trCompoundIndexFortran()
-    { return "�ndice de tipos de datos"; }
+    { return "Índice de tipos de datos"; }
 
     /*! This is used in LaTeX as the title of the chapter containing
      *  the documentation of all data types (Fortran).
      */
     virtual QCString trTypeDocumentation()
-    { return "Documentaci�n de tipos de datos"; }
+    { return "Documentación de tipos de datos"; }
 
     /*! This is used in the documentation of a file as a header before the 
      *  list of (global) subprograms (Fortran).
@@ -1697,7 +1697,7 @@ class TranslatorSpanish : public Translator
      *  of documentation blocks for subprograms (Fortran)
      */
     virtual QCString trSubprogramDocumentation()
-    { return "Documentaci�n de Funciones/Subprogramas"; }
+    { return "Documentación de Funciones/Subprogramas"; }
 
     /*! This is used in the documentation of a file/namespace/group before 
      *  the list of links to documented compounds (Fortran)
@@ -1707,14 +1707,14 @@ class TranslatorSpanish : public Translator
 
     /*! used as the title of page containing all the index of all modules (Fortran). */
     virtual QCString trModulesList()
-    { return "Lista de m�dulos"; }
+    { return "Lista de módulos"; }
 
     /*! used as an introduction to the modules list (Fortran) */
     virtual QCString trModulesListDescription(bool extractAll)
     {
-      QCString result="Lista de todos los m�dulos ";
+      QCString result="Lista de todos los módulos ";
       if (!extractAll) result+="documentados ";
-      result+="con una breve descripci�n:";
+      result+="con una breve descripción:";
       return result;
     }
 
@@ -1727,13 +1727,13 @@ class TranslatorSpanish : public Translator
       if (isTemplate) result+=" la plantilla de";
       switch(compType)
       {
-        case ClassDef::Class:      result+="l m�dulo"; break;
+        case ClassDef::Class:      result+="l módulo"; break;
         case ClassDef::Struct:     result+="l tipo"; break;
-        case ClassDef::Union:      result+=" la uni�n"; break;
+        case ClassDef::Union:      result+=" la unión"; break;
         case ClassDef::Interface:  result+=" la interfaz"; break;
         case ClassDef::Protocol:   result+="l protocolo"; break;
-        case ClassDef::Category:   result+=" la categor�a"; break;
-        case ClassDef::Exception:  result+=" la excepci�n"; break;
+        case ClassDef::Category:   result+=" la categoría"; break;
+        case ClassDef::Exception:  result+=" la excepción"; break;
       }
       result+=(QCString)clName;
       return result;
@@ -1742,28 +1742,28 @@ class TranslatorSpanish : public Translator
     /*! used as the title of the HTML page of a module (Fortran) */
     virtual QCString trModuleReference(const char *namespaceName)
     {
-      QCString result="Referencia m�dulo ";
+      QCString result="Referencia módulo ";
       result+=namespaceName;        
       return result;
     }
 
     /*! This is put above each page as a link to all members of modules. (Fortran) */
     virtual QCString trModulesMembers()
-    { return "Miembros m�dulo"; }
+    { return "Miembros módulo"; }
 
     /*! This is an introduction to the page with all modules members (Fortran) */
     virtual QCString trModulesMemberDescription(bool extractAll)
     { 
-      QCString result="Lista de todos los miembros del m�dulo ";
+      QCString result="Lista de todos los miembros del módulo ";
       if (!extractAll) result+="documentados ";
       result+="con enlaces ";
       if (extractAll) 
       {
-        result+="a la documentaci�n del m�dulo para cada uno:";
+        result+="a la documentación del módulo para cada uno:";
       }
       else 
       {
-        result+="al m�dulo al que pertenecen:";
+        result+="al módulo al que pertenecen:";
       }
       return result;
     }
@@ -1772,7 +1772,7 @@ class TranslatorSpanish : public Translator
      *  index of all modules (Fortran).
      */
     virtual QCString trModulesIndex()
-    { return "�ndice de m�dulos"; }
+    { return "Índice de módulos"; }
     
     /*! This is used for translation of the word that will possibly
      *  be followed by a single name or by a list of names 
@@ -1780,7 +1780,7 @@ class TranslatorSpanish : public Translator
      */
     virtual QCString trModule(bool first_capital, bool singular)
     {       
-      QCString result((first_capital ? "M�dulo" : "m�dulo"));
+      QCString result((first_capital ? "Módulo" : "módulo"));
       if (!singular)  result+="s";
       return result;
     }
@@ -1792,16 +1792,16 @@ class TranslatorSpanish : public Translator
                                                  bool single)
     { // here s is one of " Module", " Struct" or " Union"
       // single is true implies a single file
-      QCString result=(QCString)"La documentaci�n para est";
+      QCString result=(QCString)"La documentación para est";
       switch(compType)
       {
-    	case ClassDef::Class:      result+="e m�dulo"; break;
+    	case ClassDef::Class:      result+="e módulo"; break;
     	case ClassDef::Struct:     result+="e tipo"; break;
-    	case ClassDef::Union:      result+="a uni�n"; break;
+    	case ClassDef::Union:      result+="a unión"; break;
     	case ClassDef::Interface:  result+="e interfaz"; break;
     	case ClassDef::Protocol:   result+="e protocolo"; break;
-    	case ClassDef::Category:   result+="a categor�a"; break;
-    	case ClassDef::Exception:  result+="a excepci�n"; break;
+    	case ClassDef::Category:   result+="a categoría"; break;
+    	case ClassDef::Exception:  result+="a excepción"; break;
       }
       result+=" fue generada de";
       if (single) result+="l siguiente fichero:";
@@ -1844,7 +1844,7 @@ class TranslatorSpanish : public Translator
     /*! directory relation for \a name */
     virtual QCString trDirRelation(const char *name)
     {
-      return QCString(name)+" relaci�n";
+      return QCString(name)+" relación";
     }
 
     /*! Loading message shown when loading search results */
@@ -1878,7 +1878,7 @@ class TranslatorSpanish : public Translator
     /*! introduction text for the directory dependency graph */
     virtual QCString trDirDependency(const char *name)
     {
-      return (QCString)"Gr�fico de dependencias para el directorio "+name;
+      return (QCString)"Gráfico de dependencias para el directorio "+name;
     }
 
     /*! when clicking a directory dependency label, a page with a
@@ -1913,8 +1913,8 @@ class TranslatorSpanish : public Translator
                                 int hour,int minutes,int seconds,
                                 bool includeTime)
     {
-      static const char *days[]   = { "Lunes","Martes","Mi�rcoles","Jueves",
-									  "Viernes","S�bado","Domingo" };
+      static const char *days[]   = { "Lunes","Martes","Miércoles","Jueves",
+									  "Viernes","Sábado","Domingo" };
       static const char *months[] = { "Enero","Febrero","Marzo","Abril",
 									  "Mayo","Junio","Julio","Agosto",
 									  "Septiembre","Octubre","Noviembre","Diciembre" };
-- 
cgit v0.12

