From a9b8e48237d4094095b91031ac7c9fb0f4cc028e Mon Sep 17 00:00:00 2001
From: dimitri <dimitri@afe2bf4a-e733-0410-8a33-86f594647bc7>
Date: Thu, 12 Feb 2004 20:39:00 +0000
Subject: Release-1.3.6

---
 Doxyfile                      |   2 +-
 INSTALL                       |   4 +-
 README                        |   4 +-
 VERSION                       |   2 +-
 doc/index.doc                 |   2 +-
 doc/install.doc               |   8 +--
 doc/language.doc              |   2 +-
 libmd5/md5.c                  |   2 +-
 libmd5/md5.h                  |   2 +-
 src/classdef.cpp              |   7 +++
 src/classdef.h                |   9 +++
 src/code.l                    |  56 +++++++++++++++---
 src/commentcnv.l              |   2 +-
 src/compound.xsd              |   2 +
 src/compound_xsd.h            |   2 +
 src/docparser.cpp             |  19 ++++--
 src/docparser.h               |   6 +-
 src/dot.cpp                   |  51 ++++++++++------
 src/doxygen.cpp               |  18 ++++--
 src/entry.h                   |   8 ++-
 src/filedef.cpp               |   3 -
 src/groupdef.cpp              |   5 +-
 src/htmldocvisitor.cpp        |   9 ++-
 src/htmlgen.cpp               |  40 +++++++++----
 src/htmlgen.h                 |   6 +-
 src/index.xsd                 |   2 +
 src/index_xsd.h               |   2 +
 src/latexgen.h                |   6 +-
 src/mangen.h                  |   6 +-
 src/memberdef.cpp             |  78 +++++++++++++++++++------
 src/memberdef.h               |   1 +
 src/membergroup.h             |   2 +-
 src/namespacedef.cpp          |   3 +
 src/outputgen.h               |   6 +-
 src/outputlist.cpp            |   1 +
 src/outputlist.h              |  13 +++--
 src/rtfgen.h                  |   6 +-
 src/scanner.l                 | 131 ++++++++++++++++++++++++++++++------------
 src/translator_br.h           |   4 ++
 src/translator_ca.h           |   4 ++
 src/translator_cn.h           |   4 ++
 src/translator_cz.h           |   4 ++
 src/translator_de.h           |   4 ++
 src/translator_dk.h           |   4 ++
 src/translator_en.h           |   4 ++
 src/translator_es.h           |   4 ++
 src/translator_fi.h           |   2 +
 src/translator_fr.h           |   4 ++
 src/translator_gr.h           |   4 ++
 src/translator_hr.h           |   4 ++
 src/translator_hu.h           |   4 ++
 src/translator_it.h           |   4 ++
 src/translator_jp.h           |   4 ++
 src/translator_kr.h           |   4 ++
 src/translator_nl.h           |   4 ++
 src/translator_no.h           |   4 ++
 src/translator_pl.h           |   4 ++
 src/translator_pt.h           |   4 ++
 src/translator_ro.h           |   4 ++
 src/translator_ru.h           |   8 +++
 src/translator_se.h           |   4 ++
 src/translator_si.h           |   4 ++
 src/translator_sk.h           |   4 ++
 src/translator_sr.h           |   4 ++
 src/translator_tw.h           |   4 ++
 src/translator_ua.h           |  22 +++++--
 tmake/bin/tmake               |   4 +-
 tmake/lib/hpux-acc/tmake.conf |   2 +-
 68 files changed, 508 insertions(+), 158 deletions(-)

diff --git a/Doxyfile b/Doxyfile
index aaebebe..30ef62a 100644
--- a/Doxyfile
+++ b/Doxyfile
@@ -203,7 +203,7 @@ PERL_PATH              = /usr/bin/perl
 #---------------------------------------------------------------------------
 CLASS_DIAGRAMS         = NO
 HIDE_UNDOC_RELATIONS   = YES
-HAVE_DOT               = NO
+HAVE_DOT               = YES
 CLASS_GRAPH            = YES
 COLLABORATION_GRAPH    = YES
 UML_LOOK               = NO
diff --git a/INSTALL b/INSTALL
index c8cfd36..1b79237 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,7 +1,7 @@
-DOXYGEN Version 1.3.5-20040125
+DOXYGEN Version 1.3.6
 
 Please read the installation section of the manual 
 (http://www.doxygen.org/install.html) for instructions.
 
 --------
-Dimitri van Heesch (25 January 2004)
+Dimitri van Heesch (12 February 2004)
diff --git a/README b/README
index 36cacfc..bf5c967 100644
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-DOXYGEN Version 1.3.5_20040125
+DOXYGEN Version 1.3.6
 
 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 January 2004)
+Dimitri van Heesch (dimitri@stack.nl) (12 February 2004)
diff --git a/VERSION b/VERSION
index ec52481..95b25ae 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.3.5-20040125
+1.3.6
diff --git a/doc/index.doc b/doc/index.doc
index 7e8ce2c..4956018 100644
--- a/doc/index.doc
+++ b/doc/index.doc
@@ -27,7 +27,7 @@ Version: $(VERSION)
 
 <h2>Introduction</h2>
 Doxygen is a documentation system for C++, C, Java, IDL 
-(Corba and Microsoft flavors) and to some extent PHP, C# and D. 
+(Corba and Microsoft flavors) and to some extent Objective-C, PHP, C# and D. 
 
 It can help you in three ways:
 <ol>
diff --git a/doc/install.doc b/doc/install.doc
index f996711..8546efe 100644
--- a/doc/install.doc
+++ b/doc/install.doc
@@ -436,11 +436,11 @@ Here is what is required:
     As a third alternative one could use the GNUWin32 tools that can be
     found at http://gnuwin32.sourceforge.net/ 
     
-    Make sure the <code>BISONLIB</code> environment variable points to the
+    Make sure the <code>BISON_SIMPLE</code> environment variable points to the
     location where the files <code>bison.simple</code> and 
-    <code>bison.hairy</code> are located. For instance if these files are in
-    <code>c:\\tools\\cygwin\\share</code> then BISONLIB should 
-    be set to <code>//c/tools/cygwin/share/</code>
+    is located. For instance if these file is in
+    <code>c:\\tools\\cygwin\\usr\\share</code> then BISON_SIMPLE should 
+    be set to <code>c:/tools/cygwin/usr/share/bison.simple</code>
 
     Also make sure the tools are available from a dos box, by adding 
     the directory they are in to the search path.
diff --git a/doc/language.doc b/doc/language.doc
index 8434f74..98188f3 100644
--- a/doc/language.doc
+++ b/doc/language.doc
@@ -25,7 +25,7 @@ Doxygen has built-in support for multiple languages. This means
 that the text fragments that doxygen generates can be produced in
 languages other than English (the default) at configuration time.
 
-Currently (version 1.3.5), 30 languages 
+Currently (version 1.3.5-20040202), 30 languages 
 are supported (sorted alphabetically): 
 Brazilian Portuguese, Catalan, Chinese, Chinese Traditional, Croatian, 
 Czech, Danish, Dutch, English, Finnish, 
diff --git a/libmd5/md5.c b/libmd5/md5.c
index d75105c..0945b28 100644
--- a/libmd5/md5.c
+++ b/libmd5/md5.c
@@ -174,7 +174,7 @@ void MD5Final (MD5_CTX *context, unsigned char digest[16])
   MD5_memset ((POINTER)context, 0, sizeof (*context));
 }
 
-void MD5Buffer (const char *buf,unsigned int len,unsigned char sig[16])
+void MD5Buffer (const unsigned char *buf,unsigned int len,unsigned char sig[16])
 {
   MD5_CTX md5;
   MD5Init(&md5);
diff --git a/libmd5/md5.h b/libmd5/md5.h
index e62aa07..8e85a8a 100644
--- a/libmd5/md5.h
+++ b/libmd5/md5.h
@@ -42,7 +42,7 @@ typedef struct {
 void MD5Init(MD5_CTX *ctx);
 void MD5Update (MD5_CTX *ctx, const unsigned char *buf, unsigned int len);
 void MD5Final (MD5_CTX *ctx, unsigned char sig[16]);
-void MD5Buffer (const char *buf,unsigned int len,unsigned char sig[16]);
+void MD5Buffer (const unsigned char *buf,unsigned int len,unsigned char sig[16]);
 void MD5SigToString(unsigned char sig[16],char *str,int len);
 
 #ifdef __cplusplus
diff --git a/src/classdef.cpp b/src/classdef.cpp
index 9ca6ae8..ff014c9 100644
--- a/src/classdef.cpp
+++ b/src/classdef.cpp
@@ -91,6 +91,7 @@ ClassDef::ClassDef(
   m_artificial = FALSE;
   m_isAbstract = FALSE;
   m_isStatic = FALSE;
+  m_isObjC = FALSE;
   m_membersMerged = FALSE;
   QCString ns;
   extractNamespaceName(m_name,m_className,ns);
@@ -997,6 +998,10 @@ void ClassDef::writeDocumentation(OutputList &ol)
       {
         ol.docify("import ");
       }
+      else if (isObjectiveC())
+      {
+        ol.docify("#import ");
+      }
       else
       {
         ol.docify("#include ");
@@ -2381,6 +2386,8 @@ QCString ClassDef::compoundTypeString() const
     case Struct:    return "struct";
     case Union:     return "union";
     case Interface: return "interface";
+    case Protocol:  return "protocol";
+    case Category:  return "category";
     case Exception: return "exception";
   }
   return "unknown";
diff --git a/src/classdef.h b/src/classdef.h
index ae42993..fb7dd88 100644
--- a/src/classdef.h
+++ b/src/classdef.h
@@ -63,6 +63,8 @@ class ClassDef : public Definition
                         Struct=Entry::STRUCT_SEC, 
                         Union=Entry::UNION_SEC,
                         Interface=Entry::INTERFACE_SEC,
+                        Protocol=Entry::PROTOCOL_SEC,
+                        Category=Entry::CATEGORY_SEC,
                         Exception=Entry::EXCEPTION_SEC
                       };
     DefType definitionType() { return TypeClass; }
@@ -197,6 +199,9 @@ class ClassDef : public Definition
      */
     bool isAbstract() const { return m_isAbstract; }
 
+    /*! Returns TRUE if this class is implemented in Objective-C */
+    bool isObjectiveC() const { return m_isObjC; }
+
     /*! returns the name of the class including outer classes, but not
      *  including namespaces.
      */
@@ -288,6 +293,7 @@ class ClassDef : public Definition
     void addMembersToTemplateInstance(ClassDef *cd,const char *templSpec);
     void setClassIsArtificial() { m_artificial = TRUE; }
     void setIsStatic(bool b) { m_isStatic=b; }
+    void setIsObjectiveC(bool b) { m_isObjC=b; }
     void addListReferences();
 
     /*! Creates a new compound definition.
@@ -425,6 +431,9 @@ class ClassDef : public Definition
     /*! Is the class part of an unnamed namespace? */
     bool m_isStatic;
 
+    /*! Is the class part implemented in Objective C? */
+    bool m_isObjC;
+
     /*! TRUE if classes members are merged with those of the base classes. */
     bool m_membersMerged;
 
diff --git a/src/code.l b/src/code.l
index 2f3b501..316b05f 100644
--- a/src/code.l
+++ b/src/code.l
@@ -1079,9 +1079,10 @@ SCOPENAME "$"?(({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
 TEMPLIST "<"[^\"\}\{\(\)\/\n\>]*">"
 SCOPETNAME ((({ID}{TEMPLIST}?){BN}*"::"{BN}*)*)((~{BN}*)?{ID})
 SCOPEPREFIX ({ID}{TEMPLIST}?{BN}*"::"{BN}*)+
-KEYWORD ("asm"|"auto"|"class"|"const"|"const_cast"|"delete"|"dynamic_cast"|"enum"|"explicit"|"extern"|"false"|"friend"|"inline"|"mutable"|"namespace"|"new"|"operator"|"private"|"protected"|"public"|"register"|"reinterpret_cast"|"sizeof"|"static"|"static_cast"|"struct"|"template"|"this"|"true"|"typedef"|"typeid"|"typename"|"union"|"using"|"virtual"|"volatile"|"abstract"|"final"|"import"|"synchronized"|"transient")
+KEYWORD_OBJC ("@public"|"@private"|"@protected"|"@class"|"@implementation"|"@interface"|"@end"|"@selector"|"@protocol")
+KEYWORD ("asm"|"auto"|"class"|"const"|"const_cast"|"delete"|"dynamic_cast"|"enum"|"explicit"|"extern"|"false"|"friend"|"inline"|"mutable"|"namespace"|"new"|"operator"|"private"|"protected"|"public"|"register"|"reinterpret_cast"|"sizeof"|"static"|"static_cast"|"struct"|"template"|"this"|"true"|"typedef"|"typeid"|"typename"|"union"|"using"|"virtual"|"volatile"|"abstract"|"final"|"import"|"synchronized"|"transient"|KEYWORD_OBJC)
 FLOWKW  ("break"|"case"|"catch"|"continue"|"default"|"do"|"else"|"for"|"goto"|"if"|"return"|"switch"|"throw"|"throws"|"try"|"while")
-TYPEKW  ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"|"void"|"wchar_t"|"boolean")
+TYPEKW  ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"|"void"|"wchar_t"|"boolean"|"id"|"SEL")
 
 %option noyywrap
 
@@ -1109,12 +1110,12 @@ TYPEKW  ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
 %%
 
 <*>\x0d
-<Body>^([ \t]*"#"[ \t]*"include"[ \t]*)("<"|"\"") {
+<Body>^([ \t]*"#"[ \t]*("include"|"import")[ \t]*)("<"|"\"") {
   					  startFontClass("preprocessor");
 					  g_code->codify(yytext);
   					  BEGIN( ReadInclude ); 
 					}
-<Body>("class"|"struct"|"union"|"namespace")[ \t\n]+ { 
+<Body>("class"|"struct"|"union"|"namespace"|"@interface"|"@implementation"|"@interface")[ \t\n]+ { 
   					  startFontClass("keyword");
   					  codifyLines(yytext);
 					  endFontClass();
@@ -1234,11 +1235,30 @@ TYPEKW  ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
 					    g_currentMemberDef=0;
 					    if (g_currentDefinition) 
 					      g_currentDefinition=g_currentDefinition->getOuterScope();
-					    else
-					      g_currentDefinition=0;
 					  }
 					  BEGIN(Body);
 					}
+<Body>"@end"				{ 
+                                          g_theVarContext.popScope();
+
+					  int *scope = g_scopeStack.pop();
+  					  if (scope==SCOPEBLOCK || scope==CLASSBLOCK) 
+					  {
+					    popScope();
+					  }
+
+					  startFontClass("keyword");
+  					  g_code->codify(yytext);
+					  endFontClass();
+
+  					  g_inClass=FALSE; 
+
+					  g_insideBody=FALSE;
+					  g_currentMemberDef=0;
+					  if (g_currentDefinition) 
+					    g_currentDefinition=g_currentDefinition->getOuterScope();
+					  BEGIN(Body);
+					}
 <ClassName,ClassVar>";"			{ 
   					  g_code->codify(yytext);
 					  g_searchingForBody=FALSE; 
@@ -1330,7 +1350,7 @@ TYPEKW  ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
 					  g_curClassBases.clear();
 					  BEGIN( Body );
  					}
-<Bases>"virtual"|"public"|"protected"|"private" { 
+<Bases>"virtual"|"public"|"protected"|"private"|"@public"|"@private"|"@protected" { 
   					  startFontClass("keyword");
   					  g_code->codify(yytext);
 					  endFontClass();
@@ -1354,6 +1374,22 @@ TYPEKW  ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
   					  if (--g_sharpCount<=0)
 					  BEGIN ( Bases );
 					}
+<Bases>"("                              {
+                                          g_code->codify(yytext);
+                                          g_sharpCount=1;
+                                          BEGIN ( SkipSharp );
+                                        }
+<SkipSharp>"("                          {
+                                          g_code->codify(yytext);
+                                          ++g_sharpCount;
+                                        }
+<SkipSharp>")"                          {
+                                          g_code->codify(yytext);
+                                          if (--g_sharpCount<=0)
+                                            BEGIN ( Bases );
+                                        }
+      
+      
 <Bases>","                              { 
   					  g_code->codify(yytext);
 					}
@@ -1618,9 +1654,14 @@ TYPEKW  ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
 					    g_type.resize(0);
 					    g_name.resize(0);
 					  }
+					  else if (*yytext=='[')
+					  {
+					    g_theCallContext.pushScope();
+					  }
 					  g_args.resize(0);
   					}
 <Body>"]"				{
+					  g_theCallContext.popScope();
   					  g_code->codify(yytext);
 					  // TODO: nested arrays like: a[b[0]->func()]->func()
 					  g_name = g_saveName.copy();
@@ -1673,6 +1714,7 @@ TYPEKW  ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
 					  }
 					}
 <MemberCall2,FuncCall>")"		{ 
+					  g_theVarContext.addVariable(g_parmType,g_parmName);
 					  g_theCallContext.popScope();
   					  g_code->codify(yytext);
   					  if (--g_bracketCount<=0) 
diff --git a/src/commentcnv.l b/src/commentcnv.l
index cfb3846..668e2e9 100644
--- a/src/commentcnv.l
+++ b/src/commentcnv.l
@@ -238,7 +238,7 @@ void replaceComment(int offset);
 				     g_readLineCtx=YY_START;
 				     BEGIN(ReadLine);
   				   }
-<SComment>^[ \t]*"//!"/.*\n        { 
+<SComment>^[ \t]*"//!"/.*\n        {  
   				     replaceComment(0);
 				     g_readLineCtx=YY_START;
 				     BEGIN(ReadLine);
diff --git a/src/compound.xsd b/src/compound.xsd
index 51f7ff6..aa45adf 100644
--- a/src/compound.xsd
+++ b/src/compound.xsd
@@ -606,6 +606,8 @@
       <xsd:enumeration value="struct" />
       <xsd:enumeration value="union" />
       <xsd:enumeration value="interface" />
+      <xsd:enumeration value="protocol" />
+      <xsd:enumeration value="category" />
       <xsd:enumeration value="exception" />
       <xsd:enumeration value="file" />
       <xsd:enumeration value="namespace" />
diff --git a/src/compound_xsd.h b/src/compound_xsd.h
index 90753b7..d43646e 100644
--- a/src/compound_xsd.h
+++ b/src/compound_xsd.h
@@ -606,6 +606,8 @@
 "      <xsd:enumeration value=\"struct\" />\n"
 "      <xsd:enumeration value=\"union\" />\n"
 "      <xsd:enumeration value=\"interface\" />\n"
+"      <xsd:enumeration value=\"protocol\" />\n"
+"      <xsd:enumeration value=\"category\" />\n"
 "      <xsd:enumeration value=\"exception\" />\n"
 "      <xsd:enumeration value=\"file\" />\n"
 "      <xsd:enumeration value=\"namespace\" />\n"
diff --git a/src/docparser.cpp b/src/docparser.cpp
index 80bea8d..760e1b5 100644
--- a/src/docparser.cpp
+++ b/src/docparser.cpp
@@ -3316,7 +3316,8 @@ void DocPara::handleImage(const QString &cmdName)
     return;
   }
   doctokenizerYYsetStatePara();
-  DocImage *img = new DocImage(this,findAndCopyImage(g_token->name,t),t);
+  HtmlAttribList attrList;
+  DocImage *img = new DocImage(this,attrList,findAndCopyImage(g_token->name,t),t);
   m_children.append(img);
   img->parse();
 }
@@ -3982,7 +3983,8 @@ int DocPara::handleHtmlStartTag(const QString &tagName,const HtmlAttribList &tag
       {
         HtmlAttribListIterator li(tagHtmlAttribs);
         HtmlAttrib *opt;
-        for (li.toFirst();(opt=li.current());++li)
+        int index=0;
+        for (li.toFirst();(opt=li.current());++li,++index)
         {
           if (opt->name=="name") // <a name=label> tag
           {
@@ -4002,7 +4004,8 @@ int DocPara::handleHtmlStartTag(const QString &tagName,const HtmlAttribList &tag
             // copy attributes
             HtmlAttribList attrList = tagHtmlAttribs;
             // and remove the href attribute
-            attrList.remove(opt);
+            bool result = attrList.remove(index);
+            ASSERT(result);
             DocHRef *href = new DocHRef(this,attrList,opt->value);
             m_children.append(href);
             g_insideHtmlLink=TRUE;
@@ -4039,12 +4042,18 @@ int DocPara::handleHtmlStartTag(const QString &tagName,const HtmlAttribList &tag
         HtmlAttribListIterator li(tagHtmlAttribs);
         HtmlAttrib *opt;
         bool found=FALSE;
-        for (li.toFirst();(opt=li.current());++li)
+        int index=0;
+        for (li.toFirst();(opt=li.current());++li,++index)
         {
           //printf("option name=%s value=%s\n",opt->name.data(),opt->value.data());
           if (opt->name=="src" && !opt->value.isEmpty())
           {
-            DocImage *img = new DocImage(this,opt->value,DocImage::Html);
+            // copy attributes
+            HtmlAttribList attrList = tagHtmlAttribs;
+            // and remove the href attribute
+            bool result = attrList.remove(index);
+            ASSERT(result);
+            DocImage *img = new DocImage(this,attrList,opt->value,DocImage::Html);
             m_children.append(img);
             found = TRUE;
           }
diff --git a/src/docparser.h b/src/docparser.h
index 8742ed5..05d6c93 100644
--- a/src/docparser.h
+++ b/src/docparser.h
@@ -561,8 +561,8 @@ class DocImage : public CompAccept<DocImage>, public DocNode
 {
   public:
     enum Type { Html, Latex, Rtf };
-    DocImage(DocNode *parent,const QString &name,Type t) : 
-      m_parent(parent), m_name(name), m_type(t) {}
+    DocImage(DocNode *parent,const HtmlAttribList &attribs,const QString &name,Type t) : 
+      m_parent(parent), m_attribs(attribs), m_name(name), m_type(t) {}
     Kind kind() const          { return Kind_Image; }
     Type type() const          { return m_type; }
     QString name() const       { return m_name; }
@@ -570,11 +570,13 @@ class DocImage : public CompAccept<DocImage>, public DocNode
     bool hasCaption() const    { return !m_children.isEmpty(); }
     QString width() const      { return m_width; }
     QString height() const     { return m_height; }
+    const HtmlAttribList &attribs() const { return m_attribs; }
     void accept(DocVisitor *v) { CompAccept<DocImage>::accept(this,v); }
     void parse();
 
   private:
     DocNode *m_parent;
+    HtmlAttribList m_attribs;
     QString  m_name;
     Type     m_type;
     QString  m_width;
diff --git a/src/dot.cpp b/src/dot.cpp
index 87f843b..d7de2db 100644
--- a/src/dot.cpp
+++ b/src/dot.cpp
@@ -604,7 +604,7 @@ void DotNode::write(QTextStream &t,
                     bool backArrows
                    )
 {
-  //printf("DotNode::write(%d) name=%s\n",distance,m_label.data());
+  //printf("DotNode::write(%d) name=%s this=%p written=%d\n",distance,m_label.data(),this,m_written);
   if (m_written) return; // node already written to the output
   if (m_distance>distance) return;
   QList<DotNode> *nl = toChildren ? m_children : m_parents; 
@@ -631,6 +631,7 @@ void DotNode::write(QTextStream &t,
       {
         if (cn->m_distance<=distance) 
         {
+          //printf("write arrow %s%s%s\n",label().data(),backArrows?"<-":"->",cn->label().data());
           writeArrow(t,gt,format,cn,dnli2.current(),topDown,backArrows);
         }
         cn->write(t,gt,format,topDown,toChildren,distance,backArrows);
@@ -644,19 +645,21 @@ void DotNode::write(QTextStream &t,
       {
         if (pn->m_distance<=distance) 
         {
+          //printf("write arrow %s%s%s\n",label().data(),backArrows?"<-":"->",pn->label().data());
           writeArrow(t,
-                     gt,
-                     format,
-                     pn,
-                     pn->m_edgeInfo->at(pn->m_children->findRef(this)),
-                     FALSE,
-                     backArrows
-                    );
+              gt,
+              format,
+              pn,
+              pn->m_edgeInfo->at(pn->m_children->findRef(this)),
+              FALSE,
+              backArrows
+              );
         }
         pn->write(t,gt,format,TRUE,FALSE,distance,backArrows);
       }
     }
   }
+  //printf("end DotNode::write(%d) name=%s\n",distance,m_label.data());
 }
 
 void DotNode::writeXML(QTextStream &t,bool isClassGraph)
@@ -935,12 +938,18 @@ void DotGfxHierarchyTable::writeGraph(QTextStream &out,const char *path)
       if (node->m_subgraphId==n->m_subgraphId) 
       {
         node->clearWriteFlag();
+      }
+    }
+    for (dnli2.toFirst();(node=dnli2.current());++dnli2)
+    {
+      if (node->m_subgraphId==n->m_subgraphId) 
+      {
         node->write(md5stream,DotNode::Hierarchy,BITMAP,FALSE,TRUE,1000,TRUE);
       }
     }
     uchar md5_sig[16];
     QCString sigStr(33);
-    MD5Buffer(buf.ascii(),buf.length(),md5_sig);
+    MD5Buffer((const unsigned char *)buf.ascii(),buf.length(),md5_sig);
     MD5SigToString(md5_sig,sigStr.data(),33);
     if (checkAndUpdateMd5Signature(baseName,sigStr) || 
         !QFileInfo(mapName).exists())
@@ -957,6 +966,12 @@ void DotGfxHierarchyTable::writeGraph(QTextStream &out,const char *path)
         if (node->m_subgraphId==n->m_subgraphId) 
         {
           node->clearWriteFlag();
+        }
+      }
+      for (dnli2.toFirst();(node=dnli2.current());++dnli2)
+      {
+        if (node->m_subgraphId==n->m_subgraphId) 
+        {
           node->write(t,DotNode::Hierarchy,BITMAP,FALSE,TRUE,1000,TRUE);
         }
       }
@@ -1006,11 +1021,11 @@ void DotGfxHierarchyTable::addHierarchy(DotNode *n,ClassDef *cd,bool hideSuper)
   for ( ; (bcd=bcli.current()) ; ++bcli )
   {
     ClassDef *bClass=bcd->classDef; 
-    //printf("Trying super class=`%s'\n",bClass->name().data());
+    //printf("  Trying super class=`%s' usedNodes=%d\n",bClass->name().data(),m_usedNodes->count());
     if (bClass->isVisibleInHierarchy() && hasVisibleRoot(bClass->baseClasses()))
     {
       DotNode *bn;
-      //printf("Node `%s' Found visible class=`%s'\n",n->m_label.data(),
+      //printf("  Node `%s' Found visible class=`%s'\n",n->m_label.data(),
       //                                              bClass->name().data());
       if ((bn=m_usedNodes->find(bClass->name()))) // node already present 
       {
@@ -1018,7 +1033,7 @@ void DotGfxHierarchyTable::addHierarchy(DotNode *n,ClassDef *cd,bool hideSuper)
         {
           n->addChild(bn,bcd->prot);
           bn->addParent(n);
-          //printf("Adding node %s to existing base node %s (c=%d,p=%d)\n",
+          //printf("  Adding node %s to existing base node %s (c=%d,p=%d)\n",
           //       n->m_label.data(),
           //       bn->m_label.data(),
           //       bn->m_children ? bn->m_children->count() : 0,
@@ -1027,7 +1042,7 @@ void DotGfxHierarchyTable::addHierarchy(DotNode *n,ClassDef *cd,bool hideSuper)
         }
         //else
         //{
-        //  printf("Class already has an arrow!\n");
+        //  printf("  Class already has an arrow!\n");
         //}
       }
       else 
@@ -1039,14 +1054,15 @@ void DotGfxHierarchyTable::addHierarchy(DotNode *n,ClassDef *cd,bool hideSuper)
              bClass->displayName(),
              tmp_url.data()
            );
-        //printf("Adding node %s to new base node %s (c=%d,p=%d)\n",
+        n->addChild(bn,bcd->prot);
+        bn->addParent(n);
+        //printf("  Adding node %s to new base node %s (c=%d,p=%d)\n",
         //   n->m_label.data(),
         //   bn->m_label.data(),
         //   bn->m_children ? bn->m_children->count() : 0,
         //   bn->m_parents  ? bn->m_parents->count()  : 0
         //  );
-        n->addChild(bn,bcd->prot);
-        bn->addParent(n);
+        //printf("  inserting %s (%p)\n",bClass->name().data(),bn);
         m_usedNodes->insert(bClass->name(),bn); // add node to the used list
       }
       if (!bClass->visited && !hideSuper && bClass->subClasses()->count()>0)
@@ -1057,6 +1073,7 @@ void DotGfxHierarchyTable::addHierarchy(DotNode *n,ClassDef *cd,bool hideSuper)
       }
     }
   }
+  //printf("end addHierarchy\n");
 }
 
 void DotGfxHierarchyTable::addClassList(ClassSDict *cl)
@@ -1481,7 +1498,7 @@ QCString computeMd5Signature(DotNode *root,
   }
   uchar md5_sig[16];
   QCString sigStr(33);
-  MD5Buffer(buf.ascii(),buf.length(),md5_sig);
+  MD5Buffer((const unsigned char *)buf.ascii(),buf.length(),md5_sig);
   MD5SigToString(md5_sig,sigStr.data(),33);
   //printf("md5: %s | file: %s\n",sigStr,baseName.data());
   return sigStr;
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index 640ce0f..869cb8c 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -715,16 +715,24 @@ static void addClassToContext(Entry *root)
     {
       case Entry::UNION_SEC: 
       case Entry::UNIONDOC_SEC: 
-        sec=ClassDef::Union; break;
+        sec=ClassDef::Union; 
+        break;
       case Entry::STRUCT_SEC:
       case Entry::STRUCTDOC_SEC: 
-        sec=ClassDef::Struct; break;
+        sec=ClassDef::Struct; 
+        break;
       case Entry::INTERFACE_SEC:
       case Entry::INTERFACEDOC_SEC:
-        sec=ClassDef::Interface; break;
+        sec=ClassDef::Interface; 
+        break;
+      case Entry::PROTOCOL_SEC:
+      case Entry::PROTOCOLDOC_SEC:
+        sec=ClassDef::Protocol; 
+        break;
       case Entry::EXCEPTION_SEC:
       case Entry::EXCEPTIONDOC_SEC:
-        sec=ClassDef::Exception; break;
+        sec=ClassDef::Exception; 
+        break;
     }
     Debug::print(Debug::Classes,0,"  New class `%s' (sec=0x%08x)! #tArgLists=%d\n",
         fullName.data(),root->section,root->tArgLists ? (int)root->tArgLists->count() : -1);
@@ -746,9 +754,9 @@ static void addClassToContext(Entry *root)
         tagName,refFileName);
     cd->setDocumentation(root->doc,root->docFile,root->docLine); // copy docs to definition
     cd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+    cd->setIsObjectiveC(root->objc);
     //printf("new ClassDef %s tempArgList=%p specScope=%s\n",fullName.data(),root->tArgList,root->scopeSpec.data());
 
-
     ArgumentList *tArgList = 
       getTemplateArgumentsFromName(fullName,root->tArgLists);
     //printf("class %s template args=%s\n",fullName.data(),
diff --git a/src/entry.h b/src/entry.h
index cf46027..82d1a36 100644
--- a/src/entry.h
+++ b/src/entry.h
@@ -184,8 +184,11 @@ class Entry
       EXCEPTION_SEC    = 0x00000008,
       NAMESPACE_SEC    = 0x00000010,
       INTERFACE_SEC    = 0x00000020,
+      PROTOCOL_SEC     = 0x00000040,
+      CATEGORY_SEC     = 0x00000080,
       COMPOUND_MASK    = CLASS_SEC | STRUCT_SEC | UNION_SEC | 
-                         INTERFACE_SEC | EXCEPTION_SEC,
+                         INTERFACE_SEC | EXCEPTION_SEC | 
+                         PROTOCOL_SEC | CATEGORY_SEC,
       SCOPE_MASK       = COMPOUND_MASK | NAMESPACE_SEC,
       
       CLASSDOC_SEC     = 0x00000100, 
@@ -194,8 +197,9 @@ class Entry
       EXCEPTIONDOC_SEC = 0x00000800,
       NAMESPACEDOC_SEC = 0x00001000,
       INTERFACEDOC_SEC = 0x00002000,
+      PROTOCOLDOC_SEC  = 0x00004000,
       COMPOUNDDOC_MASK = CLASSDOC_SEC | STRUCTDOC_SEC | UNIONDOC_SEC | 
-                         INTERFACEDOC_SEC | EXCEPTIONDOC_SEC,
+                         INTERFACEDOC_SEC | EXCEPTIONDOC_SEC | PROTOCOLDOC_SEC,
 
       SOURCE_SEC       = 0x00010000,
       HEADER_SEC       = 0x00020000,
diff --git a/src/filedef.cpp b/src/filedef.cpp
index c8e3839..0642245 100644
--- a/src/filedef.cpp
+++ b/src/filedef.cpp
@@ -150,12 +150,9 @@ void FileDef::writeDetailedDocumentation(OutputList &ol)
   {
     ol.writeRuler();
     ol.pushGeneratorState();
-    //bool latexOn = ol.isEnabled(OutputGenerator::Latex);
-    //if (latexOn) ol.disable(OutputGenerator::Latex);
     ol.disable(OutputGenerator::Latex);
     ol.disable(OutputGenerator::RTF);
     ol.writeAnchor(0,"_details"); 
-    //if (latexOn) ol.enable(OutputGenerator::Latex);
     ol.popGeneratorState();
     ol.startGroupHeader();
     ol.parseText(theTranslator->trDetailedDescription());
diff --git a/src/groupdef.cpp b/src/groupdef.cpp
index fd82f35..e9507ad 100644
--- a/src/groupdef.cpp
+++ b/src/groupdef.cpp
@@ -479,10 +479,13 @@ void GroupDef::writeDocumentation(OutputList &ol)
     ol.pushGeneratorState();
     ol.disable(OutputGenerator::Latex);
     ol.disable(OutputGenerator::RTF);
+    ol.disable(OutputGenerator::Man);
     ol.startTextLink(0,"_details");
     ol.parseText(theTranslator->trMore());
     ol.endTextLink();
-    //ol.enable(OutputGenerator::Latex);
+    ol.enableAll();
+    ol.disableAllBut(OutputGenerator::Man);
+    ol.newParagraph();
     ol.popGeneratorState();
   }
 
diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp
index 03ca662..bea84fa 100644
--- a/src/htmldocvisitor.cpp
+++ b/src/htmldocvisitor.cpp
@@ -293,10 +293,9 @@ void HtmlDocVisitor::visit(DocFormula *f)
 {
   if (m_hide) return;
   bool bDisplay = f->text().at(0)=='\\';
-  if (bDisplay) m_t << "<p class=formulaDsp>" << endl;
-  m_t << "<img class=formula"
-      << (bDisplay ? "Dsp" : "Inl");
-  m_t << " alt=\"";
+  if (bDisplay) m_t << "<p class=\"formulaDsp\">" << endl;
+  m_t << "<img class=\"formula" << (bDisplay ? "Dsp" : "Inl");
+  m_t << "\" alt=\"";
   filterQuotedCdataAttr(f->text());
   m_t << "\"";
   /// @todo cache image dimensions on formula generation and give height/width
@@ -696,7 +695,7 @@ void HtmlDocVisitor::visitPre(DocImage *img)
     }
     m_t << "<div align=\"center\">" << endl;
     m_t << "<img src=\"" << img->name() << "\" alt=\"" 
-      << baseName << "\">" << endl;
+      << baseName << "\"" << htmlAttribsToString(img->attribs()) << ">" << endl;
     if (img->hasCaption())
     {
       m_t << "<p><strong>";
diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp
index 26ace6e..a5113b6 100644
--- a/src/htmlgen.cpp
+++ b/src/htmlgen.cpp
@@ -57,15 +57,22 @@ static const char *defaultStyleSheet =
 "	margin: 2px;\n"
 "	padding: 2px;\n"
 "}\n"
-"A.qindex { text-decoration: none; font-weight: bold; color: #1A419D}\n"
-"A.qindex:visited { text-decoration: none; font-weight: bold; color: #1A419D}\n"
+"A.qindex {\n"
+"       text-decoration: none;\n"
+"       font-weight: bold;\n"
+"       color: #1A419D;\n"
+"       padding: 2px;\n"
+"}\n"
+"A.qindex:visited {\n"
+"       text-decoration: none;\n"
+"       font-weight: bold;\n"
+"       color: #1A419D\n"
+"       padding: 2px;\n"
+"}\n"
 "A.qindex:hover {\n"
 "	text-decoration: none;\n"
 "	background-color: #ddddff;\n"
-"	padding-top: 2px;\n"
-"	padding-right: 2px;\n"
-"	padding-bottom: 2px;\n"
-"	padding-left: 2px;\n"
+"	padding: 2px;\n"
 "}\n"
 "A.qindexHL {\n"
 "	text-decoration: none;\n"
@@ -987,11 +994,13 @@ void HtmlGenerator::endMemberDocPrefixItem()
   t << "        </tr>" << endl;
 }
 
-void HtmlGenerator::startMemberDocName()
+void HtmlGenerator::startMemberDocName(bool align)
 {
   DBG_HTML(t << "<!-- startMemberDocName -->" << endl;)
   t << "        <tr>" << endl;
-  t << "          <td class=\"md\" nowrap valign=\"top\"> ";
+  t << "          <td class=\"md\" nowrap valign=\"top\"";
+  if (align) t << " align=\"right\"";
+  t << "> ";
 }
 
 void HtmlGenerator::endMemberDocName()
@@ -1000,13 +1009,18 @@ void HtmlGenerator::endMemberDocName()
   t << "</td>" << endl;
 }
 
-void HtmlGenerator::startParameterList()
+void HtmlGenerator::startParameterList(bool openBracket)
 {
   DBG_HTML(t << "<!-- startParameterList -->" << endl;)
-  t << "          <td class=\"md\" valign=\"top\">(&nbsp;</td>" << endl;
+  t << "          <td class=\"md\" valign=\"top\">";
+  if (openBracket)
+  {
+    t << "(&nbsp;";
+  }
+  t << "</td>" << endl;
 }
 
-void HtmlGenerator::startParameterType(bool first)
+void HtmlGenerator::startParameterType(bool first,const char *key)
 {
   if (first)
   {
@@ -1017,7 +1031,9 @@ void HtmlGenerator::startParameterType(bool first)
   {
     DBG_HTML(t << "<!-- startParameterType -->" << endl;)
     t << "        <tr>" << endl;
-    t << "          <td></td>" << endl;
+    t << "          <td class=\"md\" nowrap align=\"right\">";
+    if (key) t << key;
+    t << "</td>" << endl;
     t << "          <td></td>" << endl;
     t << "          <td class=\"md\" nowrap>";
   }
diff --git a/src/htmlgen.h b/src/htmlgen.h
index a788f0a..4c303d6 100644
--- a/src/htmlgen.h
+++ b/src/htmlgen.h
@@ -195,13 +195,13 @@ class HtmlGenerator : public OutputGenerator
 
     void startMemberDocPrefixItem();
     void endMemberDocPrefixItem();
-    void startMemberDocName();
+    void startMemberDocName(bool);
     void endMemberDocName();
-    void startParameterType(bool first);
+    void startParameterType(bool first,const char *key);
     void endParameterType();
     void startParameterName(bool);
     void endParameterName(bool last,bool emptyList);
-    void startParameterList();
+    void startParameterList(bool);
     void endParameterList();
 
     void startFontClass(const char *s) { t << "<span class=\"" << s << "\">"; }
diff --git a/src/index.xsd b/src/index.xsd
index 20918c0..1e214fa 100644
--- a/src/index.xsd
+++ b/src/index.xsd
@@ -32,6 +32,8 @@
       <xsd:enumeration value="struct"/>
       <xsd:enumeration value="union"/>
       <xsd:enumeration value="interface"/>
+      <xsd:enumeration value="protocol"/>
+      <xsd:enumeration value="category"/>
       <xsd:enumeration value="exception"/>
       <xsd:enumeration value="file"/>
       <xsd:enumeration value="namespace"/>
diff --git a/src/index_xsd.h b/src/index_xsd.h
index 0049282..f947a8a 100644
--- a/src/index_xsd.h
+++ b/src/index_xsd.h
@@ -32,6 +32,8 @@
 "      <xsd:enumeration value=\"struct\"/>\n"
 "      <xsd:enumeration value=\"union\"/>\n"
 "      <xsd:enumeration value=\"interface\"/>\n"
+"      <xsd:enumeration value=\"protocol\"/>\n"
+"      <xsd:enumeration value=\"category\"/>\n"
 "      <xsd:enumeration value=\"exception\"/>\n"
 "      <xsd:enumeration value=\"file\"/>\n"
 "      <xsd:enumeration value=\"namespace\"/>\n"
diff --git a/src/latexgen.h b/src/latexgen.h
index 652ccd4..2ec1563 100644
--- a/src/latexgen.h
+++ b/src/latexgen.h
@@ -270,13 +270,13 @@ class LatexGenerator : public OutputGenerator
 
     void startMemberDocPrefixItem() {}
     void endMemberDocPrefixItem() {}
-    void startMemberDocName() {}
+    void startMemberDocName(bool) {}
     void endMemberDocName() {}
-    void startParameterType(bool) {}
+    void startParameterType(bool,const char *) {}
     void endParameterType() {}
     void startParameterName(bool) {}
     void endParameterName(bool,bool) {}
-    void startParameterList() {}
+    void startParameterList(bool) {}
     void endParameterList() {}
 
     void startFontClass(const char *) {}
diff --git a/src/mangen.h b/src/mangen.h
index 1c8086e..a830a32 100644
--- a/src/mangen.h
+++ b/src/mangen.h
@@ -237,13 +237,13 @@ class ManGenerator : public OutputGenerator
 
     void startMemberDocPrefixItem() {}
     void endMemberDocPrefixItem() {}
-    void startMemberDocName() {}
+    void startMemberDocName(bool) {}
     void endMemberDocName() {}
-    void startParameterType(bool) {}
+    void startParameterType(bool,const char *) {}
     void endParameterType() {}
     void startParameterName(bool) {}
     void endParameterName(bool,bool) {}
-    void startParameterList() {}
+    void startParameterList(bool) {}
     void endParameterList() {}
 
     void startFontClass(const char *) {}
diff --git a/src/memberdef.cpp b/src/memberdef.cpp
index cde2c5a..8a3b927 100644
--- a/src/memberdef.cpp
+++ b/src/memberdef.cpp
@@ -89,10 +89,10 @@ static void writeDefArgumentList(OutputList &ol,ClassDef *cd,
   ol.pushGeneratorState();
   ol.disableAllBut(OutputGenerator::Html);
   ol.endMemberDocName();
-  ol.startParameterList(); 
+  ol.startParameterList(!md->isObjCMethod()); 
   ol.enableAll();
   ol.disable(OutputGenerator::Html);
-  ol.docify("("); // start argument list
+  if (!md->isObjCMethod()) ol.docify("("); // start argument list
   ol.endMemberDocName();
   ol.popGeneratorState();
   //printf("===> name=%s isDefine=%d\n",md->name().data(),md->isDefine());
@@ -125,10 +125,10 @@ static void writeDefArgumentList(OutputList &ol,ClassDef *cd,
   bool first=TRUE;
   while (a)
   {
-    if (md->isDefine() || first) ol.startParameterType(first);
+    if (md->isDefine() || first) ol.startParameterType(first,md->isObjCMethod()?"dummy":0);
     QRegExp re(")(");
     int vp;
-    if (!a->attrib.isEmpty()) // argument has an IDL attribute
+    if (!a->attrib.isEmpty() && !md->isObjCMethod()) // argument has an IDL attribute
     {
       ol.docify(a->attrib+" ");
     }
@@ -136,12 +136,14 @@ static void writeDefArgumentList(OutputList &ol,ClassDef *cd,
     {
       //printf("a->type=`%s' a->name=`%s'\n",a->type.data(),a->name.data());
       QCString n=a->type.left(vp);
+      if (md->isObjCMethod()) { n.prepend("("); n.append(")"); }
       if (!cName.isEmpty()) n=addTemplateNames(n,cd->name(),cName);
       linkifyText(TextGeneratorOLImpl(ol),cd,md->getBodyDef(),md->name(),n);
     }
     else // non-function pointer type
     {
       QCString n=a->type;
+      if (md->isObjCMethod()) { n.prepend("("); n.append(")"); }
       if (!cName.isEmpty()) n=addTemplateNames(n,cd->name(),cName);
       linkifyText(TextGeneratorOLImpl(ol),cd,md->getBodyDef(),md->name(),n);
     }
@@ -181,11 +183,18 @@ static void writeDefArgumentList(OutputList &ol,ClassDef *cd,
     a=defArgList->next();
     if (a) 
     {
-      ol.docify(", "); // there are more arguments
+      if (!md->isObjCMethod()) ol.docify(", "); // there are more arguments
       if (!md->isDefine()) 
       {
+        QCString key;
+        if (md->isObjCMethod() && a->attrib.length()>2)
+        {
+          //printf("Found parameter keyword %s\n",a->attrib.data());
+          // strip [ and ]
+          key=a->attrib.mid(1,a->attrib.length()-2)+":";
+        }
         ol.endParameterName(FALSE,FALSE);
-        ol.startParameterType(FALSE);
+        ol.startParameterType(FALSE,key);
       }
     }
     first=FALSE;
@@ -193,13 +202,13 @@ static void writeDefArgumentList(OutputList &ol,ClassDef *cd,
   ol.pushGeneratorState();
   ol.disable(OutputGenerator::Html);
   //if (!first) ol.writeString("&nbsp;");
-  ol.docify(")"); // end argument list
+  if (!md->isObjCMethod()) ol.docify(")"); // end argument list
   ol.enableAll();
   ol.disableAllBut(OutputGenerator::Html);
   if (!md->isDefine()) 
   {
     if (first) ol.startParameterName(defArgList->count()<2);
-    ol.endParameterName(TRUE,defArgList->count()<2);
+    ol.endParameterName(!md->isObjCMethod(),defArgList->count()<2);
   }
   else 
   {
@@ -929,6 +938,11 @@ void MemberDef::writeDeclaration(OutputList &ol,
   }
   else
   {
+    if (isObjCMethod())
+    {
+      ltype.prepend("(");
+      ltype.append(")");
+    }
     linkifyText(TextGeneratorOLImpl(ol),d,getBodyDef(),name(),ltype,TRUE); 
   }
   bool htmlOn = ol.isEnabled(OutputGenerator::Html);
@@ -996,7 +1010,7 @@ void MemberDef::writeDeclaration(OutputList &ol,
     }
   }
 
-  if (argsString()) 
+  if (argsString() && !isObjCMethod()) 
   {
     if (!isDefine()) ol.writeString(" ");
     //ol.docify(argsString());
@@ -1237,7 +1251,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
         if (si==-1) si=0;
         while ((pi=r.match(ldef,i+l,&l))!=-1) ei=i=pi+l;
         // first si characters of ldef contain compound type name
-        ol.startMemberDocName();
+        ol.startMemberDocName(isObjCMethod());
         ol.docify(ldef.left(si));
         ol.docify(" { ... } ");
         // last ei characters of ldef contain pointer/reference specifiers
@@ -1304,7 +1318,28 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
           }
         }
       }
-      ol.startMemberDocName();
+      ol.startMemberDocName(isObjCMethod());
+      if (isObjCMethod())
+      {
+        int dp = ldef.find(':');
+        if (dp!=-1)
+        {
+          ldef=ldef.left(dp+1);
+        }
+        int l=ldef.length();
+        //printf("start >%s<\n",ldef.data());
+        int i=l-1;
+        while (i>=0 && (isId(ldef.at(i)) || ldef.at(i)==':')) i--;
+        while (i>=0 && isspace(ldef.at(i))) i--;
+        if (i>0)
+        {
+          // insert braches around the type
+          QCString tmp("("+ldef.left(i+1)+")"+ldef.mid(i+1));
+          ldef=tmp;
+        }
+        //printf("end   >%s< i=%d\n",ldef.data(),i);
+        if (isStatic()) ldef.prepend("+ "); else ldef.prepend("- ");
+      }
       linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),name(),ldef);
       writeDefArgumentList(ol,cd,scopeName,this);
       if (hasOneLineInitializer()) // add initializer
@@ -1329,12 +1364,14 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
 
     Specifier lvirt=virtualness();
 
-    if (protection()!=Public || lvirt!=Normal ||
-        isFriend() || isRelated() || isExplicit() ||
-        isMutable() || (isInline() && Config_getBool("INLINE_INFO")) ||
-        isSignal() || isSlot() ||
-        isStatic() || (classDef && classDef!=container) ||
-        isSettable() || isGettable()
+    if (!isObjCMethod() &&
+        (protection()!=Public || lvirt!=Normal ||
+         isFriend() || isRelated() || isExplicit() ||
+         isMutable() || (isInline() && Config_getBool("INLINE_INFO")) ||
+         isSignal() || isSlot() ||
+         isStatic() || (classDef && classDef!=container) ||
+         isSettable() || isGettable()
+        )
        )
     {
       // write the member specifier list
@@ -2137,3 +2174,10 @@ void MemberDef::setInbodyDocumentation(const char *docs,
   m_inbodyFile = docFile;
 }
 
+bool MemberDef::isObjCMethod() const
+{
+  if (classDef && classDef->isObjectiveC() && isFunction()) return TRUE;
+  return FALSE; 
+}
+
+
diff --git a/src/memberdef.h b/src/memberdef.h
index e29621f..b3dc90f 100644
--- a/src/memberdef.h
+++ b/src/memberdef.h
@@ -126,6 +126,7 @@ class MemberDef : public Definition
     bool isGettable() const               { return (memSpec&Entry::Gettable)!=0; }
     bool isSettable() const               { return (memSpec&Entry::Settable)!=0; }
     bool isExternal() const               { return explExt; }
+    bool isObjCMethod() const;
     bool isConstructor() const;
     bool isDestructor() const;
     bool hasOneLineInitializer() const;
diff --git a/src/membergroup.h b/src/membergroup.h
index 63e6bdb..454117b 100644
--- a/src/membergroup.h
+++ b/src/membergroup.h
@@ -22,7 +22,7 @@
 #include <qlist.h>
 #include "sortdict.h"
 
-#define NOGROUP -1
+#define DOX_NOGROUP -1
 
 class MemberDef;
 class ClassDef;
diff --git a/src/namespacedef.cpp b/src/namespacedef.cpp
index 8e66402..6d00bbc 100644
--- a/src/namespacedef.cpp
+++ b/src/namespacedef.cpp
@@ -308,6 +308,9 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
     ol.startTextLink(0,"_details");
     ol.parseText(theTranslator->trMore());
     ol.endTextLink();
+    ol.enableAll();
+    ol.disableAllBut(OutputGenerator::Man);
+    ol.newParagraph();
     ol.popGeneratorState();
   }
   ol.disable(OutputGenerator::Man);
diff --git a/src/outputgen.h b/src/outputgen.h
index ae9cc04..cb85446 100644
--- a/src/outputgen.h
+++ b/src/outputgen.h
@@ -346,13 +346,13 @@ class OutputGenerator : public BaseOutputDocInterface
     virtual void lastIndexPage() = 0;
     virtual void startMemberDocPrefixItem() = 0;
     virtual void endMemberDocPrefixItem() = 0;
-    virtual void startMemberDocName() = 0;
+    virtual void startMemberDocName(bool) = 0;
     virtual void endMemberDocName() = 0;
-    virtual void startParameterType(bool) = 0;
+    virtual void startParameterType(bool,const char *) = 0;
     virtual void endParameterType() = 0;
     virtual void startParameterName(bool) = 0;
     virtual void endParameterName(bool,bool) = 0;
-    virtual void startParameterList() = 0;
+    virtual void startParameterList(bool) = 0;
     virtual void endParameterList() = 0;
 
   protected:
diff --git a/src/outputlist.cpp b/src/outputlist.cpp
index 1629a52..fbacc76 100644
--- a/src/outputlist.cpp
+++ b/src/outputlist.cpp
@@ -273,6 +273,7 @@ FORALL4(const char *a1,const char *a2,const char *a3,bool a4,a1,a2,a3,a4)
 #endif
 FORALL2(int a1,bool a2,a1,a2)
 FORALL2(bool a1,HighlightedItem a2,a1,a2)
+FORALL2(bool a1,const char *a2,a1,a2)
 FORALL2(ParamListTypes a1,const char *a2,a1,a2)
 FORALL1(IndexSections a1,a1)
 FORALL2(const char *a1,const char *a2,a1,a2)
diff --git a/src/outputlist.h b/src/outputlist.h
index d6c68c9..86600df 100644
--- a/src/outputlist.h
+++ b/src/outputlist.h
@@ -329,20 +329,20 @@ class OutputList : public OutputDocInterface
     { forall(&OutputGenerator::startMemberDocPrefixItem); }
     void endMemberDocPrefixItem()
     { forall(&OutputGenerator::endMemberDocPrefixItem); }
-    void startMemberDocName()
-    { forall(&OutputGenerator::startMemberDocName); }
+    void startMemberDocName(bool align)
+    { forall(&OutputGenerator::startMemberDocName,align); }
     void endMemberDocName()
     { forall(&OutputGenerator::endMemberDocName); }
-    void startParameterType(bool first)
-    { forall(&OutputGenerator::startParameterType,first); }
+    void startParameterType(bool first,const char *key)
+    { forall(&OutputGenerator::startParameterType,first,key); }
     void endParameterType()
     { forall(&OutputGenerator::endParameterType); }
     void startParameterName(bool one)
     { forall(&OutputGenerator::startParameterName,one); }
     void endParameterName(bool last,bool one)
     { forall(&OutputGenerator::endParameterName,last,one); }
-    void startParameterList()
-    { forall(&OutputGenerator::startParameterList); }
+    void startParameterList(bool openBracket)
+    { forall(&OutputGenerator::startParameterList,openBracket); }
     void endParameterList()
     { forall(&OutputGenerator::endParameterList); }
     void startFontClass(const char *c)
@@ -392,6 +392,7 @@ class OutputList : public OutputDocInterface
 #endif
     FORALLPROTO2(int,bool);
     FORALLPROTO2(bool,HighlightedItem);
+    FORALLPROTO2(bool,const char *);
     FORALLPROTO2(ParamListTypes,const char *);
     FORALLPROTO2(const char *,const char *);
     FORALLPROTO2(const char *,bool);
diff --git a/src/rtfgen.h b/src/rtfgen.h
index 5785e58..65cd94e 100644
--- a/src/rtfgen.h
+++ b/src/rtfgen.h
@@ -240,13 +240,13 @@ class RTFGenerator : public OutputGenerator
 
     void startMemberDocPrefixItem() {}
     void endMemberDocPrefixItem() {}
-    void startMemberDocName() {}
+    void startMemberDocName(bool) {}
     void endMemberDocName() {}
-    void startParameterType(bool) {}
+    void startParameterType(bool,const char *) {}
     void endParameterType() {}
     void startParameterName(bool) {}
     void endParameterName(bool,bool) {}
-    void startParameterList() {}
+    void startParameterList(bool) {}
     void endParameterList() {}
 
     void startFontClass(const char *) {}
diff --git a/src/scanner.l b/src/scanner.l
index beb2ac6..873b377 100644
--- a/src/scanner.l
+++ b/src/scanner.l
@@ -106,7 +106,7 @@ static bool             removeSlashes;
 static Specifier 	virt;
 static Specifier 	baseVirt;
 static QCString         msType,msName,msArgs;
-static int              memberGroupId = NOGROUP;
+static int              memberGroupId = DOX_NOGROUP;
 static QCString         memberGroupHeader;
 static QCString         memberGroupDocs;
 static bool             isTypedef;
@@ -180,7 +180,7 @@ static void initParser()
   sharpCount = 0;
   roundCount = 0;
   curlyCount = 0;
-  memberGroupId = NOGROUP;
+  memberGroupId = DOX_NOGROUP;
   memberGroupRelates.resize(0);
   memberGroupInside.resize(0);
   mtype = Method;
@@ -809,10 +809,10 @@ PHPKW	  ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
 %%
 
 <*>\x06[^\x06]*\x06			{ // new file
-  					  if (memberGroupId!=NOGROUP)
+  					  if (memberGroupId!=DOX_NOGROUP)
 					  {
 					    warn(yyFileName,yyLineNr,"Warning: Missing //@}");
-					    memberGroupId=NOGROUP;
+					    memberGroupId=DOX_NOGROUP;
 					  }
   					  yyLineNr= 0 ; // there is always an extra newline at the start of the file
 					  int i; 
@@ -1063,6 +1063,9 @@ PHPKW	  ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
 <ObjCParams>{ID}			{ // name of parameter
   					  current->argList->getLast()->name=yytext;
   					}
+<ObjCParams>"..."			{ // name of parameter
+  					  current->argList->getLast()->name=yytext;
+  					}
 <ObjCParams>":"				{ 
 					  current->name += ':';
 					}
@@ -1236,6 +1239,19 @@ PHPKW	  ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
 					  current->bodyLine  = yyLineNr;
 					  BEGIN( CompoundName );
   					}
+<FindMembers>{B}*"@protocol"{BN}+	{ // Objective-C protocol definition
+					  lineCount();
+  					  isTypedef=FALSE;
+					  current->section = Entry::PROTOCOL_SEC;
+					  current->objc = insideObjC = TRUE;
+					  current->protection = protection = Public ;
+					  addType( current ) ;
+					  current->type += " protocol" ;
+					  current->fileName  = yyFileName;
+					  current->startLine = yyLineNr;
+					  current->bodyLine  = yyLineNr;
+					  BEGIN( CompoundName );
+  					}
 <FindMembers>{B}*"exception"{BN}+ 	{ // Corba IDL exception
   					  isTypedef=FALSE;
 					  current->section = Entry::EXCEPTION_SEC;
@@ -1247,6 +1263,7 @@ PHPKW	  ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
 					  lineCount();
 					  BEGIN( CompoundName );
   					}
+<FindMembers>"@class" | // for Objective C class declarations
 <FindMembers>{B}*(("typedef"{BN}+)?)("volatile"{BN}+)?"class{" |
 <FindMembers>{B}*(("typedef"{BN}+)?)("volatile"{BN}+)?"class"{BN}+ { 
 					  isTypedef=((QCString)yytext).find("typedef")!=-1;
@@ -1290,15 +1307,6 @@ PHPKW	  ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
 					  current->fileName  = yyFileName;
 					  current->startLine = yyLineNr;
 					  current->bodyLine  = yyLineNr;
-					  //if (current->mtArgList) // transfer template arguments
-					  //{
-					  //  if (current->tArgList)
-					  //  {
-					  //    delete current->tArgList;
-					  //  }
-					  //  current->tArgList = current->mtArgList;
-					  //  current->mtArgList = 0;
-					  //}
 					  lineCount() ;
 					  if (yytext[yyleng-1]=='{') unput('{');
 					  BEGIN( CompoundName ) ;
@@ -1868,7 +1876,7 @@ PHPKW	  ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
 					  if (current_root->section & Entry::SCOPE_MASK)
                                           {
 					      current->inside = current_root->name+"::";
-                                              if (current->mGrpId!=NOGROUP)
+                                              if (current->mGrpId!=DOX_NOGROUP)
                                               {
                                                 memberGroupInside = current->inside.copy();
                                               }
@@ -1892,7 +1900,7 @@ PHPKW	  ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
 					  }
   					}
 <FindMembers,FindFields,ReadInitializer>"//"([!/]?){B}*{CMD}"}".*|"/*"([!*]?){B}*{CMD}"}".*"*/"	{
-                                          if (memberGroupId==NOGROUP && autoGroupStack.isEmpty())
+                                          if (memberGroupId==DOX_NOGROUP && autoGroupStack.isEmpty())
                                           {
                                             warn(yyFileName,yyLineNr,
 	                                        "Warning: end of group without matching begin.");
@@ -2282,8 +2290,10 @@ PHPKW	  ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
   					      current->args = current->args.simplifyWhiteSpace();
   					      current->type = current->type.simplifyWhiteSpace();
   					      current->name = current->name.stripWhiteSpace();
-					      //printf("adding `%s' `%s' `%s' brief=%s\n",current->type.data(),current->name.data(),current->args.data(),current->brief.data());
-					      if (insideObjC) // method definition follows
+					      //printf("adding `%s' `%s' `%s' brief=%s insideObjC=%d %x\n",current->type.data(),current->name.data(),current->args.data(),current->brief.data(),insideObjC,current->section);
+					      if (insideObjC && 
+						  (current->section==Entry::INTERFACE_SEC || current->section==Entry::CATEGORY_SEC)
+						 ) // method definition follows
 					      {
 				                BEGIN( ReadBodyIntf ) ;
 					      }
@@ -3299,7 +3309,15 @@ PHPKW	  ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
   					  if (--sharpCount<=0)
 					  {
 					    current->name = removeRedundantWhiteSpace(current->name);
-					    BEGIN( lastClassTemplSpecContext );
+					    if (current->section == Entry::PROTOCOL_SEC)
+					    { // Objective-C protocol
+					      unput('{'); // fake start of body
+					      BEGIN( ClassVar );
+					    }
+					    else
+					    {
+					      BEGIN( lastClassTemplSpecContext );
+					    }
 					  }
 					}
 <ClassTemplSpec>"<"			{
@@ -3312,6 +3330,10 @@ PHPKW	  ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
 <CompoundName>{SCOPENAME}		{ 
 					  current->name = yytext ;
 					  lineCount();
+					  if (current->section == Entry::PROTOCOL_SEC)
+					  {
+					    unput('{'); // fake start of body
+					  }
 					  BEGIN( ClassVar );
 					}
 <CompoundName>{CSSCOPENAME}	        { // C# style scope
@@ -3335,6 +3357,7 @@ PHPKW	  ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
   					    BEGIN( FindMembers );
 					  }
   					}
+<ClassVar>","				// Multiple class forward declaration
 <ClassVar>{ID}				{
   					  if (insideIDL && strcmp(yytext,"switch")==0)
 					  {
@@ -3381,6 +3404,7 @@ PHPKW	  ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
     					  if (insideObjC && *yytext=='(') // class category
 					  {
 					    current->name+='(';
+					    current->section=Entry::CATEGORY_SEC;
 					    BEGIN( ClassCategory );
 					  }
 					  else
@@ -3404,7 +3428,7 @@ PHPKW	  ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
   					  current->type.resize(0);
 					  if (current->section == Entry::INTERFACE_SEC || 
 					      current->section == Entry::STRUCT_SEC || 
-					      insidePHP || insideCS || insideD
+					      insidePHP || insideCS || insideD || insideObjC
 					     )
 					    baseProt=Public;
 					  else
@@ -3430,7 +3454,11 @@ PHPKW	  ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
 					    current->name.sprintf("@%d",anonCount++);
 					  }
 					  curlyCount=0;
-					  if (current->section==Entry::NAMESPACE_SEC)
+					  if (current->section==Entry::PROTOCOL_SEC)
+					  {
+					    BEGIN( ReadBodyIntf );
+					  }
+					  else if (current->section==Entry::NAMESPACE_SEC)
 					  {
 					    BEGIN( ReadNSBody );
 					  }
@@ -3467,6 +3495,24 @@ PHPKW	  ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
 					  current->args += ' ';
 					  current->args += name;
     					}
+<Bases>^{B}*/[\-+]			{
+  					  if (!insideObjC)
+					  { 
+					    REJECT;
+					  }
+					  else
+					  {
+					    unput('{'); // insert start of fake body
+					  }
+  					}
+<ClassVar,Bases>"@end"			{ // empty ObjC interface
+  					  unput('d'); // insert fake body: {}@end
+  					  unput('n'); 
+  					  unput('e'); 
+  					  unput('@'); 
+  					  unput('}'); 
+  					  unput('{');
+					}
 <ClassVar>"<"   	                { current->name += *yytext;
   					  sharpCount=1; 
 					  lastSkipSharpContext = YY_START;
@@ -3509,7 +3555,9 @@ PHPKW	  ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
   					    current->extends->append(
 					      new BaseInfo(baseName,baseProt,baseVirt)
 					    );
-					  if (current->section == Entry::INTERFACE_SEC || insideJava || insidePHP || insideCS || insideD)
+					  if (current->section==Entry::INTERFACE_SEC || 
+					      insideJava || insidePHP || insideCS || 
+					      insideD || insideObjC)
 					    baseProt=Public;
 					  else
 					    baseProt=Private;
@@ -3525,7 +3573,14 @@ PHPKW	  ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
 					      new BaseInfo(baseName,baseProt,baseVirt)
 					    );
 					  curlyCount=0;
-					  BEGIN( ReadBody ) ;
+					  if (insideObjC)
+					  {
+					    BEGIN( ReadBodyIntf );
+					  }
+					  else
+					  {
+					    BEGIN( ReadBody ) ;
+					  }
 					}
 <SkipUnionSwitch>{B}*"("		{
   					  roundCount++;
@@ -3563,7 +3618,7 @@ PHPKW	  ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
 					  if (current_root->section & Entry::SCOPE_MASK)
                                           {
 					    current->inside = current_root->name+"::";
-                                            if (current->mGrpId!=NOGROUP)
+                                            if (current->mGrpId!=DOX_NOGROUP)
                                             {
                                               memberGroupInside = current->inside.copy();
                                             }
@@ -3577,7 +3632,7 @@ PHPKW	  ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
 					  if (current_root->section & Entry::SCOPE_MASK)
                                           {
 					    current->inside = current_root->name+"::";
-                                            if (current->mGrpId!=NOGROUP)
+                                            if (current->mGrpId!=DOX_NOGROUP)
                                             {
                                               memberGroupInside = current->inside.copy();
                                             }
@@ -3633,7 +3688,7 @@ PHPKW	  ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
 					  if (current_root->section & Entry::SCOPE_MASK)
                                           {
 					    current->inside = current_root->name+"::";
-                                            if (current->mGrpId!=NOGROUP)
+                                            if (current->mGrpId!=DOX_NOGROUP)
                                             {
                                               memberGroupInside = current->inside.copy();
                                             }
@@ -3652,7 +3707,7 @@ PHPKW	  ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
 					  if (current_root->section & Entry::SCOPE_MASK)
                                           {
 					    current->inside = current_root->name+"::";
-                                            if (current->mGrpId!=NOGROUP)
+                                            if (current->mGrpId!=DOX_NOGROUP)
                                             {
                                               memberGroupInside = current->inside.copy();
                                             }
@@ -4059,7 +4114,7 @@ PHPKW	  ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
 					}
 <ClassDocRelates>({ID}"::")*{ID}	{ 
   					  current->relates = yytext;
-                                          if (current->mGrpId!=NOGROUP) 
+                                          if (current->mGrpId!=DOX_NOGROUP) 
                                           {
                                             memberGroupRelates = yytext;
                                           }
@@ -4072,7 +4127,7 @@ PHPKW	  ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
 <ClassDocRelatesAlso>({ID}"::")*{ID}    { 
   					  current->relatesDup = TRUE;
 					  current->relates = yytext;
-					  if (current->mGrpId!=NOGROUP) 
+					  if (current->mGrpId!=DOX_NOGROUP) 
 					  {
 					    memberGroupRelates = yytext;
 					  }
@@ -4536,13 +4591,13 @@ PHPKW	  ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
 							  BEGIN( GroupName );
   							}
 <ClassDoc,Doc,JavaDoc>{CMD}"{"				{
-                                                          if (memberGroupId==NOGROUP && current->section==Entry::GROUPDOC_SEC)
+                                                          if (memberGroupId==DOX_NOGROUP && current->section==Entry::GROUPDOC_SEC)
 							  {
 							    startGroupInDoc();
 							  }
   							}
 <ClassDoc,Doc,JavaDoc>{CMD}"}"				{
-                                                          if (memberGroupId==NOGROUP && autoGroupStack.isEmpty())
+                                                          if (memberGroupId==DOX_NOGROUP && autoGroupStack.isEmpty())
                                                           {
                                                              warn(yyFileName,yyLineNr,
 	                                                          "Warning: end of group without matching begin.");
@@ -5352,7 +5407,7 @@ static void startGroup()
   }
   else 
   {
-    //if (memberGroupId!=NOGROUP)
+    //if (memberGroupId!=DOX_NOGROUP)
     //{
     //  //warn(yyFileName,yyLineNr,"Warning: ignoring nested member group. "
     //  //	"Previous command was found at line %d.",lastMemberGroupLine);
@@ -5389,7 +5444,7 @@ static void startGroupInDoc()
   }
   else if (current->section == Entry::MEMBERGRP_SEC) /* scope for a member group: @name */
   {
-    //if (memberGroupId!=NOGROUP)
+    //if (memberGroupId!=DOX_NOGROUP)
     //{
     //  printf("startGroupInDoc ends group %d\n",memberGroupId);
     //  endGroup();
@@ -5414,7 +5469,7 @@ static void startGroupInDoc()
 
 static void endGroup()
 {
-  if (memberGroupId!=NOGROUP) // end of member group
+  if (memberGroupId!=DOX_NOGROUP) // end of member group
   {
     //Doxygen::memberDocDict.insert(memberGroupId,
     //	new QCString(memberGroupDocs)
@@ -5425,12 +5480,12 @@ static void endGroup()
       info->doc = memberGroupDocs;
       info->docFile = yyFileName;
     }
-    memberGroupId=NOGROUP;
+    memberGroupId=DOX_NOGROUP;
     memberGroupRelates.resize(0);
     memberGroupInside.resize(0);
     if (YY_START!=ReadInitializer) 
     {
-      current->mGrpId=NOGROUP;
+      current->mGrpId=DOX_NOGROUP;
       current->relates.resize(0);
     }
     memberGroupDocs.resize(0);
@@ -5450,7 +5505,7 @@ static void endGroup()
 
 static void forceEndGroup()
 {
-  while (memberGroupId!=NOGROUP || !autoGroupStack.isEmpty()) 
+  while (memberGroupId!=DOX_NOGROUP || !autoGroupStack.isEmpty()) 
   {
     //printf("forceEndGroup ends group %d\n",memberGroupId);
     endGroup();
@@ -5543,7 +5598,7 @@ static void parseCompounds(Entry *rt)
 	  current->protection = protection = Public ;
 	}
       }
-      else // named struct, union
+      else // named struct, union, protocol, category
       {
 	current->protection = protection = Public ;
       }
@@ -5551,7 +5606,7 @@ static void parseCompounds(Entry *rt)
       virt = Normal;
       //printf("name=%s current->stat=%d gstat=%d\n",ce->name.data(),current->stat,gstat);
 
-      memberGroupId = NOGROUP;
+      memberGroupId = DOX_NOGROUP;
       memberGroupRelates.resize(0);
       memberGroupInside.resize(0);
       
diff --git a/src/translator_br.h b/src/translator_br.h
index 3a39c69..4e3279e 100644
--- a/src/translator_br.h
+++ b/src/translator_br.h
@@ -634,6 +634,8 @@ class TranslatorBrazilian: public Translator
         case ClassDef::Struct:     result+=" Estrutura "; break;
         case ClassDef::Union:      result+=" Uni�o "; break;
         case ClassDef::Interface:  result+=" Interface "; break;
+        case ClassDef::Protocol:   result+=" Protocol "; break; // translate me!
+        case ClassDef::Category:   result+=" Category "; break; // translate me!
         case ClassDef::Exception:  result+=" Exce��o "; break;
       }
       result+=(QCString)clName;
@@ -790,6 +792,8 @@ class TranslatorBrazilian: public Translator
         case ClassDef::Struct:     result+="estrutura "; break;
         case ClassDef::Union:      result+="uni�o "; break;
         case ClassDef::Interface:  result+="interface "; break;
+        case ClassDef::Protocol:   result+="protocol "; break; // translate me!
+        case ClassDef::Category:   result+="category "; break; // translate me!
         case ClassDef::Exception:  result+="exce��o "; break;
       }
       result+=" foi gerada a partir ";
diff --git a/src/translator_ca.h b/src/translator_ca.h
index 639519d..dff8361 100644
--- a/src/translator_ca.h
+++ b/src/translator_ca.h
@@ -644,6 +644,8 @@ class TranslatorCatalan : public TranslatorAdapter_1_2_17
         case ClassDef::Struct:     result+=" Estructura "; break;
         case ClassDef::Union:      result+=" Uni� "; break;
         case ClassDef::Interface:  result+=" Interf�cie "; break;
+        case ClassDef::Protocol:   result+=" Protocol "; break; // translate me!
+        case ClassDef::Category:   result+=" Category "; break; // translate me!
         case ClassDef::Exception:  result+=" Excepci� "; break;
       }
       if (isTemplate) result+="Template ";
@@ -801,6 +803,8 @@ class TranslatorCatalan : public TranslatorAdapter_1_2_17
         case ClassDef::Struct:     result+="estructura"; break;
         case ClassDef::Union:      result+="uni�"; break;
         case ClassDef::Interface:  result+="interf�cie"; break;
+        case ClassDef::Protocol:   result+="protocol"; break; // translate me!
+        case ClassDef::Category:   result+="category"; break; // translate me!
         case ClassDef::Exception:  result+="excepci�"; break;
       }
       result+=" es va generar a partir del";
diff --git a/src/translator_cn.h b/src/translator_cn.h
index 1083ea7..f044067 100644
--- a/src/translator_cn.h
+++ b/src/translator_cn.h
@@ -495,6 +495,8 @@ class TranslatorChinese : public TranslatorAdapter_1_2_13
         case ClassDef::Struct: result+="�ṹ"; break;
         case ClassDef::Union:  result+="����"; break;
         case ClassDef::Interface:  result+="�ӿ�"; break;
+        case ClassDef::Protocol:   result+="protocol"; break; // translate me!
+        case ClassDef::Category:   result+="category"; break; // translate me!
         case ClassDef::Exception:  result+="�쳣"; break;
       }
       result+="�ο�";
@@ -659,6 +661,8 @@ class TranslatorChinese : public TranslatorAdapter_1_2_13
         case ClassDef::Struct:     result+="�ṹ"; break;
         case ClassDef::Union:      result+="����"; break;
         case ClassDef::Interface:  result+="�ӿ�"; break;
+        case ClassDef::Protocol:   result+="protocol"; break; // translate me!
+        case ClassDef::Category:   result+="category"; break; // translate me!
         case ClassDef::Exception:  result+="�쳣"; break;
       }
       result+="���ĵ��������ļ����ɣ�";
diff --git a/src/translator_cz.h b/src/translator_cz.h
index feb92f6..9ccc00e 100644
--- a/src/translator_cz.h
+++ b/src/translator_cz.h
@@ -763,6 +763,8 @@ class TranslatorCzech : public Translator
         case ClassDef::Struct:     result+="struktury "; break;
         case ClassDef::Union:      result+="unie "; break;
         case ClassDef::Interface:  result+="rozhran� "; break;
+        case ClassDef::Protocol:   result+="protocol "; break; // translate me!
+        case ClassDef::Category:   result+="category "; break; // translate me!
         case ClassDef::Exception:  result+="v�jimky "; break;
       }
       result+=clName;
@@ -933,6 +935,8 @@ class TranslatorCzech : public Translator
         case ClassDef::Struct:     result+="tuto strukturu (struct)"; break;
         case ClassDef::Union:      result+="tuto unii (union)"; break;
         case ClassDef::Interface:  result+="toto rozhran�"; break;
+        case ClassDef::Protocol:   result+="protocol "; break; // translate me!
+        case ClassDef::Category:   result+="category "; break; // translate me!
         case ClassDef::Exception:  result+="tuto v�jimku"; break;
       }
       result+=" byla generov�na z ";
diff --git a/src/translator_de.h b/src/translator_de.h
index 2f13544..0089d27 100644
--- a/src/translator_de.h
+++ b/src/translator_de.h
@@ -670,6 +670,8 @@ class TranslatorGerman : public Translator
         case ClassDef::Struct: result+="Struktur"; break;
         case ClassDef::Union:  result+="Varianten"; break;
         case ClassDef::Interface:  result+="Schnittstellen"; break;
+        case ClassDef::Protocol:  result+="Protocol"; break; // translate me!
+        case ClassDef::Category:  result+="Category"; break; // translate me!
         case ClassDef::Exception:  result+="Ausnahmen"; break;
       }
       result+="referenz";
@@ -836,6 +838,8 @@ class TranslatorGerman : public Translator
         case ClassDef::Struct:     result+=" Struktur"; break;
         case ClassDef::Union:      result+=" Variante"; break;
         case ClassDef::Interface:  result+=" Schnittstelle"; break;
+        case ClassDef::Protocol:   result+=" Protocol"; break; // translate me!
+        case ClassDef::Category:   result+=" Category"; break; // translate me!
         case ClassDef::Exception:  result+=" Ausnahme"; break;
       }
       result+=" wurde erzeugt aufgrund der Datei";
diff --git a/src/translator_dk.h b/src/translator_dk.h
index 4eae217..5eeee4d 100644
--- a/src/translator_dk.h
+++ b/src/translator_dk.h
@@ -641,6 +641,8 @@ class TranslatorDanish : public Translator
         case ClassDef::Struct:     result+=" Datastruktur-"; break;
         case ClassDef::Union:      result+=" Union-"; break;
         case ClassDef::Interface:  result+=" Gr�nseflade-"; break;
+        case ClassDef::Protocol:   result+=" Protocol-"; break; // translate me!
+        case ClassDef::Category:   result+=" Category-"; break; // translate me!
         case ClassDef::Exception:  result+=" Exception-"; break;
       }
       if (isTemplate) result+="template-";
@@ -796,6 +798,8 @@ class TranslatorDanish : public Translator
         case ClassDef::Struct:     result+="datastruktur"; break;
         case ClassDef::Union:      result+="union"; break;
         case ClassDef::Interface:  result+="gr�nseflade"; break;
+        case ClassDef::Protocol:   result+="protocol"; break; // translate me!
+        case ClassDef::Category:   result+="category"; break; // translate me!
         case ClassDef::Exception:  result+="exception"; break;
       }
       result+=" blev genereret ud fra fil";
diff --git a/src/translator_en.h b/src/translator_en.h
index 61e8aa4..bf7bbe3 100644
--- a/src/translator_en.h
+++ b/src/translator_en.h
@@ -645,6 +645,8 @@ class TranslatorEnglish : public Translator
         case ClassDef::Struct:     result+=" Struct"; break;
         case ClassDef::Union:      result+=" Union"; break;
         case ClassDef::Interface:  result+=" Interface"; break;
+        case ClassDef::Protocol:   result+=" Protocol"; break;
+        case ClassDef::Category:   result+=" Category"; break;
         case ClassDef::Exception:  result+=" Exception"; break;
       }
       if (isTemplate) result+=" Template";
@@ -802,6 +804,8 @@ class TranslatorEnglish : public Translator
         case ClassDef::Struct:     result+="struct"; break;
         case ClassDef::Union:      result+="union"; break;
         case ClassDef::Interface:  result+="interface"; break;
+        case ClassDef::Protocol:   result+="protocol"; break;
+        case ClassDef::Category:   result+="category"; break;
         case ClassDef::Exception:  result+="exception"; break;
       }
       result+=" was generated from the following file";
diff --git a/src/translator_es.h b/src/translator_es.h
index 6298ca2..9aae1fa 100644
--- a/src/translator_es.h
+++ b/src/translator_es.h
@@ -537,6 +537,8 @@ class TranslatorSpanish : public TranslatorAdapter_1_3_3
         case ClassDef::Struct:     result+="la Estructura "; break;
         case ClassDef::Union:      result+="la Uni�n "; break;
         case ClassDef::Interface:  result+="la Interfaz "; break;
+        case ClassDef::Protocol:   result+="Protocol "; break; // translate me!
+        case ClassDef::Category:   result+="Category "; break; // translate me!
         case ClassDef::Exception:  result+="la Excepci�n "; break;
       }
       result+=(QCString)clName;
@@ -694,6 +696,8 @@ class TranslatorSpanish : public TranslatorAdapter_1_3_3
         case ClassDef::Struct:     result+="estructura"; break;
         case ClassDef::Union:      result+="uni�n"; break;
         case ClassDef::Interface:  result+="interfaz"; break;
+        case ClassDef::Protocol:   result+="protocol"; break; // translate me!
+        case ClassDef::Category:   result+="category"; break; // translate me!
         case ClassDef::Exception:  result+="excepci�n"; break;
       }
       result+=" fu� generada a partir ";
diff --git a/src/translator_fi.h b/src/translator_fi.h
index 0aba2c7..19d4b62 100644
--- a/src/translator_fi.h
+++ b/src/translator_fi.h
@@ -486,6 +486,8 @@ class TranslatorFinnish : public TranslatorEnglish
         case ClassDef::Struct: result+=" Struct"; break; // "Struct"
         case ClassDef::Union:  result+=" Union"; break; // "Union"
         case ClassDef::Interface: result+=" Interface"; break; // "Interface"
+        case ClassDef::Protocol: result+=" Protocol"; break; // translate me!
+        case ClassDef::Category: result+=" Category"; break; // translate me!
         case ClassDef::Exception: result+=" Exception"; break; // "Interface"
       }
       result+=" Referenssi"; // " Reference"
diff --git a/src/translator_fr.h b/src/translator_fr.h
index 08f4a70..9a05607 100644
--- a/src/translator_fr.h
+++ b/src/translator_fr.h
@@ -536,6 +536,8 @@ class TranslatorFrench : public Translator
         case ClassDef::Struct:     result+="la structure "; break;
         case ClassDef::Union:      result+="l'union "; break;
         case ClassDef::Interface:  result+="l'interface "; break;
+        case ClassDef::Protocol:   result+="le protocol "; break; 
+        case ClassDef::Category:   result+="la cat�gorie "; break; 
         case ClassDef::Exception:  result+="l'exception "; break;
       }
 
@@ -694,6 +696,8 @@ class TranslatorFrench : public Translator
         case ClassDef::Struct:     result+="structure"; break;
         case ClassDef::Union:      result+="union"; break;
         case ClassDef::Interface:  result+="interface"; break;
+        case ClassDef::Protocol:   result+="protocol"; break; 
+        case ClassDef::Category:   result+="category"; break; 
         case ClassDef::Exception:  result+="exception"; break;
       }
       result+=" a �t� g�n�r�e � partir ";
diff --git a/src/translator_gr.h b/src/translator_gr.h
index 8953339..3e39781 100644
--- a/src/translator_gr.h
+++ b/src/translator_gr.h
@@ -619,6 +619,8 @@ class TranslatorGreek : public TranslatorAdapter_1_2_11
         case ClassDef::Struct:     result+=" �����"; break;
         case ClassDef::Union:      result+=" ������"; break;
         case ClassDef::Interface:  result+=" ������������"; break;
+        case ClassDef::Protocol:   result+=" Protocol"; break; // translate me!
+        case ClassDef::Category:   result+=" Category"; break; // translate me!
         case ClassDef::Exception:  result+=" ���������"; break;
       }
       if (isTemplate) result+=" Template";
@@ -776,6 +778,8 @@ class TranslatorGreek : public TranslatorAdapter_1_2_11
         case ClassDef::Struct:     result+="���� � ����"; break;
         case ClassDef::Union:      result+="���� � �����"; break;
         case ClassDef::Interface:  result+="���� � �����������"; break;
+        case ClassDef::Protocol:   result+="Protocol"; break; // translate me!
+        case ClassDef::Category:   result+="Category"; break; // translate me!
         case ClassDef::Exception:  result+="���� � ��������"; break;
       }
       result+=" ������������� ��� �";
diff --git a/src/translator_hr.h b/src/translator_hr.h
index f326252..89b324c 100644
--- a/src/translator_hr.h
+++ b/src/translator_hr.h
@@ -370,6 +370,8 @@ class TranslatorCroatian : public Translator
         case ClassDef::Struct: result+=" strukture "; break;
         case ClassDef::Union:  result+=" unije "; break;
         case ClassDef::Interface:  result+=" su�elja (interface) "; break;
+        case ClassDef::Protocol:   result+=" protocol "; break; // translate me!
+        case ClassDef::Category:   result+=" category "; break; // translate me!
         case ClassDef::Exception:  result+=" iznimke (exception) "; break;
       }
           result += clName;
@@ -518,6 +520,8 @@ class TranslatorCroatian : public Translator
         case ClassDef::Struct:     result+="strukture"; break;
         case ClassDef::Union:      result+="unije"; break;
         case ClassDef::Interface:  result+="su�elja (interface)"; break;
+        case ClassDef::Protocol:   result+="protocol"; break; // translate me!
+        case ClassDef::Category:   result+="category"; break; // translate me!
         case ClassDef::Exception:  result+="iznimke (exception)"; break;
       }
       result+=" je generirana iz " + trFile(FALSE, single) + ": ";
diff --git a/src/translator_hu.h b/src/translator_hu.h
index 2a843bb..ee6a438 100644
--- a/src/translator_hu.h
+++ b/src/translator_hu.h
@@ -608,6 +608,8 @@ class TranslatorHungarian : public Translator
         case ClassDef::Struct:     result+=" strukt�ra"; break;
         case ClassDef::Union:      result+=" uni�"; break;
         case ClassDef::Interface:  result+=" interf�sz"; break;
+        case ClassDef::Protocol:   result+=" protocol"; break; // translate me!
+        case ClassDef::Category:   result+=" category"; break; // translate me!
         case ClassDef::Exception:  result+=" kiv�tel"; break;
       }
       if (isTemplate) result+="sablon-";
@@ -765,6 +767,8 @@ class TranslatorHungarian : public Translator
         case ClassDef::Struct:     result+="a strukt�r�r�l"; break;
         case ClassDef::Union:      result+="az uni�r�l"; break;
         case ClassDef::Interface:  result+="az interf�szr�l"; break;
+        case ClassDef::Protocol:   result+="protocol"; break; // translate me!
+        case ClassDef::Category:   result+="category"; break; // translate me!
         case ClassDef::Exception:  result+="a kiv�telr�l"; break;
       }
       result+=" a k�vetkez� f�jl";
diff --git a/src/translator_it.h b/src/translator_it.h
index 77162f8..4d39e94 100644
--- a/src/translator_it.h
+++ b/src/translator_it.h
@@ -644,6 +644,8 @@ class TranslatorItalian : public Translator
         case ClassDef::Struct: result+="la struct "; break;
         case ClassDef::Union:  result+="la union "; break;
         case ClassDef::Interface:  result+="l'interfaccia "; break;
+        case ClassDef::Protocol:   result+="protocol "; break; // translate me!
+        case ClassDef::Category:   result+="category "; break; // translate me!
         case ClassDef::Exception:  result+="exception "; break;
       }
       result+=(QCString)clName;
@@ -803,6 +805,8 @@ class TranslatorItalian : public Translator
         case ClassDef::Struct:     result+="struct"; break;
         case ClassDef::Union:      result+="union"; break;
         case ClassDef::Interface:  result+="interfaccia"; break;
+        case ClassDef::Protocol:   result+="protocol"; break; // translate me!
+        case ClassDef::Category:   result+="category"; break; // translate me!
         case ClassDef::Exception:  result+="exception"; break;
       }
       result+=" � stata generata a partire ";
diff --git a/src/translator_jp.h b/src/translator_jp.h
index 573a63e..2ed60ff 100644
--- a/src/translator_jp.h
+++ b/src/translator_jp.h
@@ -601,6 +601,8 @@ class TranslatorJapanese : public TranslatorAdapter_1_3_3
         case ClassDef::Struct:     result+=decode("��¤�� "); break;
         case ClassDef::Union:      result+=decode("������ "); break;
         case ClassDef::Interface:  result+=decode("���󥿥ե�����"); break;
+        case ClassDef::Protocol:   result+=decode("Protocol"); break; // translate me!
+        case ClassDef::Category:   result+=decode("Category"); break; // translate me!
         case ClassDef::Exception:  result+=decode("�㳰"); break; //TODO:fixme
       }
       if (isTemplate) result+=decode(" �ƥ�ץ졼��");
@@ -757,6 +759,8 @@ class TranslatorJapanese : public TranslatorAdapter_1_3_3
         case ClassDef::Struct:     result+=decode("��¤��"); break;
         case ClassDef::Union:      result+=decode("������"); break;
         case ClassDef::Interface:  result+=decode("���󥿥ե�����"); break;
+        case ClassDef::Protocol:   result+=decode("Protocol"); break; // translate me!
+        case ClassDef::Category:   result+=decode("Category"); break; // translate me!
         case ClassDef::Exception:  result+=decode("�㳰"); break; //TODO:fixme
       }
       result+=decode("�������ϼ��Υե����뤫����������ޤ���:");
diff --git a/src/translator_kr.h b/src/translator_kr.h
index b1cdeb7..f087589 100644
--- a/src/translator_kr.h
+++ b/src/translator_kr.h
@@ -581,6 +581,8 @@ class TranslatorKorean : public Translator
         case ClassDef::Struct:     result+=" ����ü"; break;
         case ClassDef::Union:      result+=" ����ü"; break;
         case ClassDef::Interface:  result+=" �������̽�"; break;
+        case ClassDef::Protocol:   result+=" protocol"; break; // translate me!
+        case ClassDef::Category:   result+=" category"; break; // translate me!
         case ClassDef::Exception:  result+=" ����"; break;
       }
       result+=" ����";
@@ -738,6 +740,8 @@ class TranslatorKorean : public Translator
         case ClassDef::Struct:     result+="����ü"; break;
         case ClassDef::Union:      result+="����ü"; break;
         case ClassDef::Interface:  result+="�������̽�"; break;
+        case ClassDef::Protocol:   result+="protocol"; break; // translate me!
+        case ClassDef::Category:   result+="category"; break; // translate me!
         case ClassDef::Exception:  result+="����"; break;
       }
       result+="�� ���� ����ȭ�� ������ ����";
diff --git a/src/translator_nl.h b/src/translator_nl.h
index c367c30..3e80326 100644
--- a/src/translator_nl.h
+++ b/src/translator_nl.h
@@ -280,6 +280,8 @@ class TranslatorDutch : public Translator
         case ClassDef::Struct: result+=" Struct"; break;
         case ClassDef::Union:  result+=" Union"; break;
         case ClassDef::Interface:  result+=" Interface"; break;
+        case ClassDef::Protocol:  result+=" Protocol"; break;
+        case ClassDef::Category:  result+=" Category"; break;
         case ClassDef::Exception:  result+=" Exception"; break;
       }
       result+=" Referentie";
@@ -426,6 +428,8 @@ class TranslatorDutch : public Translator
         case ClassDef::Struct:     result+="struct"; break;
         case ClassDef::Union:      result+="union"; break;
         case ClassDef::Interface:  result+="interface"; break;
+        case ClassDef::Protocol:   result+="protocol"; break;
+        case ClassDef::Category:   result+="category"; break;
         case ClassDef::Exception:  result+="exception"; break;
       }
       result+=" is gegenereerd op grond van de volgende file";
diff --git a/src/translator_no.h b/src/translator_no.h
index 60a7d83..3fd21ee 100644
--- a/src/translator_no.h
+++ b/src/translator_no.h
@@ -346,6 +346,8 @@ class TranslatorNorwegian : public TranslatorAdapter_1_2_2
         case ClassDef::Struct: result+=" struktur"; break;
         case ClassDef::Union:  result+=" union"; break;
         case ClassDef::Interface:  result+=" grensesnitt"; break;
+        case ClassDef::Protocol:  result+=" protocol"; break; // translate me!
+        case ClassDef::Category:  result+=" category"; break; // translate me!
         case ClassDef::Exception:  result+=" unntak"; break;
       }
       result+="referanse";
@@ -484,6 +486,8 @@ class TranslatorNorwegian : public TranslatorAdapter_1_2_2
         case ClassDef::Struct:     result+="denne strukt "; break;
         case ClassDef::Union:      result+="denne union "; break;
         case ClassDef::Interface:  result+="dette grensesnittet "; break;
+        case ClassDef::Protocol:   result+="protocol"; break; // translate me!
+        case ClassDef::Category:   result+="category"; break; // translate me!
         case ClassDef::Exception:  result+="unntak "; break;
       }
       result+="var generert fra f�lgende fil";
diff --git a/src/translator_pl.h b/src/translator_pl.h
index ec54ec1..278f747 100644
--- a/src/translator_pl.h
+++ b/src/translator_pl.h
@@ -658,6 +658,8 @@ class TranslatorPolish : public TranslatorAdapter_1_3
         case ClassDef::Struct:     result+=" struktury "; break;
         case ClassDef::Union:      result+=" unii "; break;
         case ClassDef::Interface:  result+=" interfejsu "; break;
+        case ClassDef::Protocol:   result+=decode(" protocol "); break; // translate me!
+        case ClassDef::Category:   result+=decode(" category "); break; // translate me!
         case ClassDef::Exception:  result+=decode(" wyj�tku "); break;
       }
       result+=(QCString)clName;
@@ -815,6 +817,8 @@ class TranslatorPolish : public TranslatorAdapter_1_3
         case ClassDef::Struct:     result+="j struktury"; break;
         case ClassDef::Union:      result+="j unii"; break;
         case ClassDef::Interface:  result+="go interfejsu"; break;
+        case ClassDef::Protocol:   result+=decode("protocol"); break; // translate me!
+        case ClassDef::Category:   result+=decode("category"); break; // translate me!
         case ClassDef::Exception:  result+="go wyj�tku"; break;
       }
       result+=" zosta�a wygenerowana z plik";
diff --git a/src/translator_pt.h b/src/translator_pt.h
index 1016cdc..1a92daf 100644
--- a/src/translator_pt.h
+++ b/src/translator_pt.h
@@ -630,6 +630,8 @@ class TranslatorPortuguese : public TranslatorAdapter_1_3_3
         case ClassDef::Struct:     result+="� estrutura "; break;
         case ClassDef::Union:      result+="� uni�o "; break;
         case ClassDef::Interface:  result+="ao interface "; break;
+        case ClassDef::Protocol:   result+="protocol "; break; // translate me!
+        case ClassDef::Category:   result+="category "; break; // translate me!
         case ClassDef::Exception:  result+="� excep��o "; break;
       }
       if (isTemplate) result+="Template ";
@@ -790,6 +792,8 @@ class TranslatorPortuguese : public TranslatorAdapter_1_3_3
         case ClassDef::Struct:     result+="esta estrutura"; break;
         case ClassDef::Union:      result+="esta uni�o"; break;
         case ClassDef::Interface:  result+="este interface"; break;
+        case ClassDef::Protocol:   result+="protocol"; break; // translate me!
+        case ClassDef::Category:   result+="category"; break; // translate me!
         case ClassDef::Exception:  result+="esta excep��o"; break;
       }
       result+=" foi gerada a partir ";
diff --git a/src/translator_ro.h b/src/translator_ro.h
index b06fad5..d9e7124 100644
--- a/src/translator_ro.h
+++ b/src/translator_ro.h
@@ -659,6 +659,8 @@ class TranslatorRomanian: public TranslatorAdapter_1_2_16
         case ClassDef::Struct:     result+="structura"; break;
         case ClassDef::Union:      result+="uniunea"; break;
         case ClassDef::Interface:  result+="interfa�a"; break;
+        case ClassDef::Protocol:   result+="protocol"; break; // translate me!
+        case ClassDef::Category:   result+="category"; break; // translate me!
         case ClassDef::Exception:  result+="excep�ia"; break;
       }
 	  if (isTemplate) result+=" (Template) ";
@@ -819,6 +821,8 @@ class TranslatorRomanian: public TranslatorAdapter_1_2_16
         case ClassDef::Struct:     result+="structur�"; break;
         case ClassDef::Union:      result+="uniune"; break;
         case ClassDef::Interface:  result+="interfa��"; break;
+        case ClassDef::Protocol:   result+="protocol"; break; // translate me!
+        case ClassDef::Category:   result+="category"; break; // translate me!
         case ClassDef::Exception:  result+="excep�ie"; break;
       }
       result+=" a fost generat� din fi�ier";
diff --git a/src/translator_ru.h b/src/translator_ru.h
index 89a3272..db45e08 100644
--- a/src/translator_ru.h
+++ b/src/translator_ru.h
@@ -660,6 +660,8 @@ class TranslatorRussian : public Translator
           case ClassDef::Struct: result+="���������"; break;
           case ClassDef::Union:  result+="�����������"; break;
           case ClassDef::Interface:  result+="����������"; break;
+          case ClassDef::Protocol:   result+="protocol"; break; // translate me!
+          case ClassDef::Category:   result+="category"; break; // translate me!
           case ClassDef::Exception:  result+="����������"; break;
         }
       }
@@ -671,6 +673,8 @@ class TranslatorRussian : public Translator
           case ClassDef::Struct: result+="���������"; break;
           case ClassDef::Union:  result+="�����������"; break;
           case ClassDef::Interface:  result+="���������"; break;
+          case ClassDef::Protocol:   result+="protocol"; break; // translate me!
+          case ClassDef::Category:   result+="category"; break; // translate me!
           case ClassDef::Exception:  result+="����������"; break;
         }
       }
@@ -834,6 +838,10 @@ class TranslatorRussian : public Translator
         case ClassDef::Interface:  result+="���������";
           if (single) result+='�'; else result+="��";
           break;
+        case ClassDef::Protocol:  result+="Protocol"; // translate me!
+          break;
+        case ClassDef::Category:  result+="Category"; // translate me!
+          break;
         case ClassDef::Exception:  result+="���������";
           if (single) result+='�'; else result+='�';
           break;
diff --git a/src/translator_se.h b/src/translator_se.h
index 2c347ed..2b07dd9 100644
--- a/src/translator_se.h
+++ b/src/translator_se.h
@@ -524,6 +524,8 @@ class TranslatorSwedish : public TranslatorAdapter_1_3_3
         case ClassDef::Struct: result+=" strukt"; break;
         case ClassDef::Union:  result+=" union"; break;
         case ClassDef::Interface:  result+=" gr�nssnitt"; break;
+        case ClassDef::Protocol:   result+=" protocol"; break; // translate me!
+        case ClassDef::Category:   result+=" category"; break; // translate me!
         case ClassDef::Exception:  result+=" undantag"; break;
       }
       if (isTemplate) result+="template";
@@ -663,6 +665,8 @@ class TranslatorSwedish : public TranslatorAdapter_1_3_3
         case ClassDef::Struct:     result+="denna strukt "; break;
         case ClassDef::Union:      result+="denna union "; break;
         case ClassDef::Interface:  result+="detta gr�nssnitt "; break;
+        case ClassDef::Protocol:   result+="protocol"; break; // translate me!
+        case ClassDef::Category:   result+="category"; break; // translate me!
         case ClassDef::Exception:  result+="detta undantag "; break;
       }
       result+="var genererad fr�n f�ljande fil";
diff --git a/src/translator_si.h b/src/translator_si.h
index 71924d3..bd70b28 100644
--- a/src/translator_si.h
+++ b/src/translator_si.h
@@ -274,6 +274,8 @@ class TranslatorSlovene : public TranslatorAdapter_1_2_16
         case ClassDef::Struct: result+=" Struktura "; break;
         case ClassDef::Union:  result+=" Mno�ica "; break;
         case ClassDef::Interface:  result+=" IDL vmesnik "; break;
+        case ClassDef::Protocol:   result+=" protocol "; break; // translate me!
+        case ClassDef::Category:   result+=" category "; break; // translate me!
         case ClassDef::Exception:  result+=" IDL prekinitev "; break;
       }
 	  result += (QCString)clName;
@@ -420,6 +422,8 @@ class TranslatorSlovene : public TranslatorAdapter_1_2_16
         case ClassDef::Struct:     result+="strukture"; break;
         case ClassDef::Union:      result+="unije"; break;
         case ClassDef::Interface:  result+="vmesnika (interface)"; break;
+        case ClassDef::Protocol:   result+="protocol"; break; // translate me!
+        case ClassDef::Category:   result+="category"; break; // translate me!
         case ClassDef::Exception:  result+="prekinitve (exception)"; break;
       }
       result+=" je zgrajen na podlagi naslednj";
diff --git a/src/translator_sk.h b/src/translator_sk.h
index b061e1a..f9a52fd 100644
--- a/src/translator_sk.h
+++ b/src/translator_sk.h
@@ -629,6 +629,8 @@ class TranslatorSlovak : public TranslatorAdapter_1_2_18
 		case ClassDef::Struct:	   result+="�trukt�ry "; break;
 		case ClassDef::Union:	   result+="unionu "; break;
 		case ClassDef::Interface:  result+="rozhrania "; break;
+		case ClassDef::Protocol:   result+="protocol "; break; // translate me!
+		case ClassDef::Category:   result+="category "; break; // translate me!
 		case ClassDef::Exception:  result+="v�nimky "; break;
 	  }
 	  result+=clName;
@@ -799,6 +801,8 @@ class TranslatorSlovak : public TranslatorAdapter_1_2_18
 		case ClassDef::Struct:	   result+="t�to �trukt�ru (struct)"; break;
 		case ClassDef::Union:	   result+="tento union"; break;
 		case ClassDef::Interface:  result+="toto rozhranie"; break;
+		case ClassDef::Protocol:   result+="protocol"; break; // translate me!
+		case ClassDef::Category:   result+="category"; break; // translate me!
 		case ClassDef::Exception:  result+="t�to v�nimku"; break;
 	  }
 	  result+=" bola generovan� z ";
diff --git a/src/translator_sr.h b/src/translator_sr.h
index 2b1d4bc..37f7dcf 100644
--- a/src/translator_sr.h
+++ b/src/translator_sr.h
@@ -645,6 +645,8 @@ private:
         case ClassDef::Struct:     result+="strukture "; break;
         case ClassDef::Union:      result+="unije "; break;
         case ClassDef::Interface:  result+="interfejsa "; break;
+        case ClassDef::Protocol:  result+="protocol "; break; // translate me!
+        case ClassDef::Category:  result+="category "; break; // translate me!
         case ClassDef::Exception:  result+="izuzetka "; break;
       }
       if (isTemplate) result += "�ablona ";  
@@ -803,6 +805,8 @@ private:
         case ClassDef::Struct:     result+="ove strukture"; break;
         case ClassDef::Union:      result+="ove unije"; break;
         case ClassDef::Interface:  result+="ovog interfejsa"; break;
+        case ClassDef::Protocol:   result+="protocol"; break; // translate me!
+        case ClassDef::Category:   result+="category"; break; // translate me!
         case ClassDef::Exception:  result+="ovog izuzetka"; break;
       }
       result+=" je napravljena iz ";
diff --git a/src/translator_tw.h b/src/translator_tw.h
index f37a878..95c9568 100644
--- a/src/translator_tw.h
+++ b/src/translator_tw.h
@@ -646,6 +646,8 @@ class TranslatorChinesetraditional : public Translator
         case ClassDef::Struct:     result+=" ���c"; break;
         case ClassDef::Union:      result+=" �p�X"; break;
         case ClassDef::Interface:  result+=" ����"; break;
+        case ClassDef::Protocol:   result+=" protocol"; break; // translate me!
+        case ClassDef::Category:   result+=" category"; break; // translate me!
         case ClassDef::Exception:  result+=" �ҥ~"; break;
       }
       if (isTemplate) result+=" �˪�";
@@ -803,6 +805,8 @@ class TranslatorChinesetraditional : public Translator
         case ClassDef::Struct:     result+="���c(structure)"; break;
         case ClassDef::Union:      result+="�p�X(union)"; break;
         case ClassDef::Interface:  result+="����(interface)"; break;
+        case ClassDef::Protocol:   result+="protocol"; break; // translate me!
+        case ClassDef::Category:   result+="category"; break; // translate me!
         case ClassDef::Exception:  result+="�ҥ~(exception)"; break;
       }
       result+=" ���O�ѤU�C�ɮפ�����";
diff --git a/src/translator_ua.h b/src/translator_ua.h
index 8789220..2a4f97f 100644
--- a/src/translator_ua.h
+++ b/src/translator_ua.h
@@ -42,19 +42,23 @@ class TranslatorUkrainian : public TranslatorAdapter_1_2_11
 
     /* Used to get the command(s) for the language support. */
     virtual QCString latexLanguageSupportCommand()
+    {
 #ifdef _WIN32
-    { return "\\usepackage[cp1251]{inputenc}\n\\usepackage[ukrainian]{babel}\n"; }
+      return "\\usepackage[cp1251]{inputenc}\n\\usepackage[ukrainian]{babel}\n"; 
 #else
-    { return "\\usepackage[koi8-u]{inputenc}\n\\usepackage[ukrainian]{babel}\n"; }
+      return "\\usepackage[koi8-u]{inputenc}\n\\usepackage[ukrainian]{babel}\n"; 
 #endif
+    }
 
     /*! return the language charset. This will be used for the HTML output */
     virtual QCString idLanguageCharset()
+    {
 #ifdef _WIN32
-    { return "Windows-1251"; }
+      return "Windows-1251"; 
 #else
-    { return "koi8-u"; }
+      return "koi8-u";
 #endif
+    }
 
     // --- Language translation methods -------------------
 
@@ -618,6 +622,8 @@ class TranslatorUkrainian : public TranslatorAdapter_1_2_11
           case ClassDef::Struct: result+="���������"; break;
           case ClassDef::Union:  result+="��'�������"; break;
           case ClassDef::Interface:  result+="����������"; break;
+          case ClassDef::Protocol:   result+="protocol"; break; // translate me!
+          case ClassDef::Category:   result+="category"; break; // translate me!
           case ClassDef::Exception:  result+="�������"; break;
         }
       }
@@ -629,6 +635,8 @@ class TranslatorUkrainian : public TranslatorAdapter_1_2_11
           case ClassDef::Struct: result+="���������"; break;
           case ClassDef::Union:  result+="��'�������"; break;
           case ClassDef::Interface:  result+="���������"; break;
+          case ClassDef::Protocol:   result+="protocol"; break; // translate me!
+          case ClassDef::Category:   result+="category"; break; // translate me!
           case ClassDef::Exception:  result+="�������"; break;
         }
       }
@@ -791,6 +799,12 @@ class TranslatorUkrainian : public TranslatorAdapter_1_2_11
         case ClassDef::Interface:
           if (single) result+="����� ����������"; else result+="��� ��������Ӧ�";
           break;
+        case ClassDef::Protocol:  
+          if (single) result+="protocol"; else result+="protocols"; // translate me!
+          break; 
+        case ClassDef::Category:
+          if (single) result+="category"; else result+="categories"; // translate me!
+          break; 
         case ClassDef::Exception:
           if (single) result+="����� �������"; else result+="��� �����˦�";
           break;
diff --git a/tmake/bin/tmake b/tmake/bin/tmake
index 4862c3f..9158d7a 100755
--- a/tmake/bin/tmake
+++ b/tmake/bin/tmake
@@ -457,7 +457,7 @@ sub Project {
     $r = "";
     foreach ( @settings ) {
 	$v = $_;
-	if ( $v =~ s/^\s*((?:[^:\s]*?:)?)(\w+)\s*(\+=|\*=|\-=|\/=|=)// ) {
+        if ( $v =~ s/^\s*([^:\r\n]+:)?(\w+)\s*(\+=|\*=|\-=|\/=|=)// ) {
 	    $if_var = $1;
 	    if ( $if_var ne "" ) {		
 		chop $if_var;
@@ -550,7 +550,7 @@ sub ScanProject {
 	s/\#.*//;				# strip comment
 	s/^\s+//;				# strip white space
 	s/\s+$//;
-	if ( /^\s*((?:(?:[^:\s]*?:)?)\w+\s*(\+|\-|\*|\/)?=)/ ) {
+        if ( /^(([^:\r\n]+:)?\w+\s*(\+|\-|\*|\/)?=)/ ) {
 	    $var = $1;				# var also contains the ".="
 	    s/^.*?=\s*//;
 	    if ( /^\<\<(.*)$/ ) {
diff --git a/tmake/lib/hpux-acc/tmake.conf b/tmake/lib/hpux-acc/tmake.conf
index 2c49784..a8f539d 100755
--- a/tmake/lib/hpux-acc/tmake.conf
+++ b/tmake/lib/hpux-acc/tmake.conf
@@ -8,7 +8,7 @@ TEMPLATE		= app
 CONFIG			= qt warn_on release
 
 TMAKE_CC		= aCC
-TMAKE_CFLAGS		= -w -D__STRICT_ANSI__
+TMAKE_CFLAGS		= -w -D__STRICT_ANSI__ -DPNG_USE_LOCAL_ARRAYS
 TMAKE_CFLAGS_WARN_ON	=
 TMAKE_CFLAGS_WARN_OFF	=
 TMAKE_CFLAGS_RELEASE	= -O
-- 
cgit v0.12