summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDimitri van Heesch <dimitri@stack.nl>2004-08-24 20:00:14 (GMT)
committerDimitri van Heesch <dimitri@stack.nl>2004-08-24 20:00:14 (GMT)
commit3aaaf142be657201a2664c10b96447acb1610187 (patch)
treeacf5ce8ed64ee56e5f7eec664f2f00260d068e9c /src
parentedeb82c1e0cebe5437fb637c9d239a8cecfca0cb (diff)
downloadDoxygen-3aaaf142be657201a2664c10b96447acb1610187.zip
Doxygen-3aaaf142be657201a2664c10b96447acb1610187.tar.gz
Doxygen-3aaaf142be657201a2664c10b96447acb1610187.tar.bz2
Release-1.3.8-20040824
Diffstat (limited to 'src')
-rw-r--r--src/code.l5
-rw-r--r--src/definition.h2
-rw-r--r--src/dirdef.cpp134
-rw-r--r--src/dirdef.h61
-rw-r--r--src/docparser.cpp25
-rw-r--r--src/docparser.h8
-rw-r--r--src/dot.cpp26
-rw-r--r--src/dot.h2
-rw-r--r--src/doxygen.cpp16
-rw-r--r--src/doxygen.h2
-rw-r--r--src/filedef.cpp7
-rw-r--r--src/filedef.h21
-rw-r--r--src/groupdef.cpp3
-rw-r--r--src/groupdef.h3
-rw-r--r--src/htmldocvisitor.cpp15
-rw-r--r--src/htmlgen.cpp35
-rw-r--r--src/htmlgen.h4
-rw-r--r--src/index.cpp69
-rw-r--r--src/libdoxygen.pro.in2
-rw-r--r--src/logos.cpp237
-rw-r--r--src/memberdef.cpp45
-rw-r--r--src/memberdef.h5
-rw-r--r--src/membergroup.cpp4
-rw-r--r--src/scanner.l4
-rw-r--r--src/util.cpp40
25 files changed, 554 insertions, 221 deletions
diff --git a/src/code.l b/src/code.l
index 4961c36..60a2b10 100644
--- a/src/code.l
+++ b/src/code.l
@@ -1995,6 +1995,11 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^' \\\n]{1,4}"'"))
addType();
g_name+=yytext;
}
+<Body>{SCOPENAME}/{B}*[;,)\]] { // "int var;" or "var, var2" or "debug(f) macro"
+ generateClassOrGlobalLink(*g_code,yytext,TRUE);
+ addType();
+ g_name+=yytext;
+ }
<Body>{SCOPENAME}/{B}* { // p->func()
generateClassOrGlobalLink(*g_code,yytext);
addType();
diff --git a/src/definition.h b/src/definition.h
index c9c8d69..9b006d5 100644
--- a/src/definition.h
+++ b/src/definition.h
@@ -48,7 +48,7 @@ class Definition
enum DefType
{
TypeClass, TypeMember, TypeFile, TypeGroup,
- TypeNamespace, TypePackage, TypePage
+ TypeNamespace, TypePackage, TypePage, TypeDir
};
/*! Use this for dynamic inspection of the type of the derived class */
virtual DefType definitionType() = 0;
diff --git a/src/dirdef.cpp b/src/dirdef.cpp
new file mode 100644
index 0000000..d7c46b1
--- /dev/null
+++ b/src/dirdef.cpp
@@ -0,0 +1,134 @@
+#include "dirdef.h"
+#include "filename.h"
+#include "doxygen.h"
+#include "util.h"
+
+//----------------------------------------------------------------------
+// method implementation
+
+DirDef::DirDef(const char *path) : Definition(path,1,path),
+ m_parent(0)
+{
+ // get short name (stipping the paths mentioned in STRIP_FROM_PATH)
+ m_dispName = stripFromPath(path);
+ m_subdirs.setAutoDelete(TRUE);
+ m_fileList = new FileList;
+ m_classSDict = new ClassSDict(17);
+}
+
+DirDef::~DirDef()
+{
+}
+
+void DirDef::addSubDir(DirDef *subdir)
+{
+ m_subdirs.append(subdir);
+ subdir->m_parent=this;
+}
+
+void DirDef::addFile(FileDef *fd)
+{
+ m_fileList->append(fd);
+ fd->setDirDef(this);
+}
+
+//----------------------------------------------------------------------
+// helper functions
+
+DirDef *DirDef::createNewDir(const char *path)
+{
+ ASSERT(path!=0);
+ DirDef *dir = Doxygen::directories.find(path);
+ if (dir==0) // new dir
+ {
+ //printf("Adding new dir %s\n",path);
+ dir = new DirDef(path);
+ Doxygen::directories.inSort(path,dir);
+ }
+ return dir;
+}
+
+bool DirDef::matchPath(const QCString &path,QStrList &l)
+{
+ const char *s=l.first();
+ while (s)
+ {
+ QCString prefix = s;
+ if (stricmp(prefix.left(path.length()),path)==0) // case insensitive compare
+ {
+ return TRUE;
+ }
+ s = l.next();
+ }
+ return FALSE;
+}
+
+/*! strip part of \a path if it matches
+ * one of the paths in the Config_getList("STRIP_FROM_PATH") list
+ */
+DirDef *DirDef::mergeDirectoryInTree(const QCString &path)
+{
+ int p=0,i=0;
+ DirDef *dir=0;
+ while ((i=path.find('/',p))!=-1)
+ {
+ QCString part=path.left(i+1);
+ if (!matchPath(part,Config_getList("STRIP_FROM_PATH")))
+ {
+ dir=createNewDir(part);
+ }
+ p=i+1;
+ }
+ return dir;
+}
+
+//----------------------------------------------------------------------
+// external functions
+
+void buildDirectories()
+{
+ // for each input file
+ FileNameListIterator fnli(Doxygen::inputNameList);
+ FileName *fn;
+ for (fnli.toFirst();(fn=fnli.current());++fnli)
+ {
+ FileNameIterator fni(*fn);
+ FileDef *fd;
+ for (;(fd=fni.current());++fni)
+ {
+ if (!fd->getReference().isEmpty())
+ {
+ DirDef *dir;
+ if ((dir=Doxygen::directories.find(fd->getPath()))==0) // new directory
+ {
+ dir = DirDef::mergeDirectoryInTree(fd->getPath());
+ }
+ if (dir) dir->addFile(fd);
+ }
+ else
+ {
+ // do something for file imported via tag files.
+ }
+ }
+ }
+
+ DirDef *root = new DirDef("root:");
+ // compute relations between directories => introduce container dirs.
+ DirDef *dir;
+ SDict<DirDef>::Iterator sdi(Doxygen::directories);
+ for (sdi.toFirst();(dir=sdi.current());++sdi)
+ {
+ printf("New dir %s\n",dir->displayName().data());
+ QCString name = dir->name();
+ int i=name.findRev('/',name.length()-2);
+ if (i!=-1)
+ {
+ DirDef *parent = Doxygen::directories.find(name.left(i+1));
+ if (parent==0) parent=root;
+ parent->addSubDir(dir);
+ printf("DirDef::addSubdir(): Adding subdir\n%s to\n%s\n",
+ dir->displayName().data(), parent->displayName().data());
+ }
+ }
+}
+
diff --git a/src/dirdef.h b/src/dirdef.h
new file mode 100644
index 0000000..369bb09
--- /dev/null
+++ b/src/dirdef.h
@@ -0,0 +1,61 @@
+/******************************************************************************
+ *
+ *
+ *
+ * Copyright (C) 1997-2004 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#ifndef DIRDEF_H
+#define DIRDEF_H
+
+#include "qtbc.h"
+#include "sortdict.h"
+#include "definition.h"
+
+class FileList;
+class ClassSDict;
+class QStrList;
+class FileDef;
+
+class DirDef : public Definition
+{
+ public:
+ DirDef(const char *path);
+ virtual ~DirDef();
+ virtual DefType definitionType() { return TypeDir; }
+ virtual QCString getOutputFileBase() const { return ""; }
+ virtual bool isLinkableInProject() const { return FALSE; }
+ virtual bool isLinkable() const { return FALSE; }
+ QCString displayName() const { return m_dispName; }
+ void addSubDir(DirDef *subdir);
+ FileList * getFiles() const { return m_fileList; }
+ ClassSDict * getClasses() const { return m_classSDict; }
+ DirDef *parent() const { return m_parent; }
+ void addFile(FileDef *fd);
+
+ static DirDef *mergeDirectoryInTree(const QCString &path);
+
+ private:
+ static DirDef *createNewDir(const char *path);
+ static bool matchPath(const QCString &path,QStrList &l);
+
+ QList<DirDef> m_subdirs;
+ DirDef *m_parent;
+ QCString m_dispName;
+ FileList *m_fileList; // list of files in the group
+ ClassSDict *m_classSDict; // list of classes in the group
+};
+
+void buildDirectories();
+
+#endif
diff --git a/src/docparser.cpp b/src/docparser.cpp
index 6043a2d..d474cfe 100644
--- a/src/docparser.cpp
+++ b/src/docparser.cpp
@@ -747,6 +747,7 @@ static void handleLinkedWord(DocNode *parent,QList<DocNode> &children)
MemberDef *member=0;
QString name = linkToText(g_token->name,TRUE);
int len = g_token->name.length();
+ ClassDef *cd=0;
if (!g_insideHtmlLink &&
resolveRef(g_context,g_token->name,g_inSeeBlock,&compound,&member))
{
@@ -784,6 +785,16 @@ static void handleLinkedWord(DocNode *parent,QList<DocNode> &children)
handleLinkedWord(parent,children);
children.append(new DocWord(parent,":"));
}
+ else if (!g_insideHtmlLink && (cd=getClass(g_token->name+"-p")))
+ {
+ // special case 2, where the token name is not a class, but could
+ // be a Obj-C protocol
+ children.append(new
+ DocLinkedWord(parent,name,
+ cd->getReference(),
+ cd->getOutputFileBase(),
+ ""));
+ }
else // normal non-linkable word
{
children.append(new DocWord(parent,g_token->name));
@@ -4383,15 +4394,25 @@ reparsetoken:
goto endparagraph;
}
}
+
+ // determine list depth
+ int depth = 0;
+ n=parent();
+ while(n) {
+ if(n->kind() == DocNode::Kind_AutoList) ++depth;
+ n=n->parent();
+ }
+
// first item or sub list => create new list
DocAutoList *al=0;
do
{
- al = new DocAutoList(this,g_token->indent,g_token->isEnumList);
+ al = new DocAutoList(this,g_token->indent,g_token->isEnumList,
+ depth);
m_children.append(al);
retval = al->parse();
} while (retval==TK_LISTITEM && // new list
- al->indent()==g_token->indent // at some indent level
+ al->indent()==g_token->indent // at same indent level
);
// check the return value
diff --git a/src/docparser.h b/src/docparser.h
index b5467c2..4b9b044 100644
--- a/src/docparser.h
+++ b/src/docparser.h
@@ -507,12 +507,15 @@ class DocCopy : public CompAccept<DocCopy>, public DocNode
class DocAutoList : public CompAccept<DocAutoList>, public DocNode
{
public:
- DocAutoList(DocNode *parent,int indent,bool isEnumList) :
- m_parent(parent), m_indent(indent), m_isEnumList(isEnumList) {}
+ DocAutoList(DocNode *parent,int indent,bool isEnumList,
+ int depth) :
+ m_parent(parent), m_indent(indent), m_isEnumList(isEnumList),
+ m_depth(depth) {}
Kind kind() const { return Kind_AutoList; }
bool isEnumList() const { return m_isEnumList; }
int indent() const { return m_indent; }
DocNode *parent() const { return m_parent; }
+ int depth() const { return m_depth; }
void accept(DocVisitor *v) { CompAccept<DocAutoList>::accept(this,v); }
int parse();
@@ -520,6 +523,7 @@ class DocAutoList : public CompAccept<DocAutoList>, public DocNode
DocNode *m_parent;
int m_indent;
bool m_isEnumList;
+ int m_depth;
};
diff --git a/src/dot.cpp b/src/dot.cpp
index 4bde818..9e26576 100644
--- a/src/dot.cpp
+++ b/src/dot.cpp
@@ -962,7 +962,7 @@ void DotGfxHierarchyTable::writeGraph(QTextStream &out,const char *path)
QDir thisDir;
// put each connected subgraph of the hierarchy in a row of the HTML output
- out << "<table border=0 cellspacing=10 cellpadding=0>" << endl;
+ out << "<table border=\"0\" cellspacing=\"10\" cellpadding=\"0\">" << endl;
QListIterator<DotNode> dnli(*m_rootSubgraphs);
DotNode *n;
@@ -2105,11 +2105,21 @@ DotCallGraph::DotCallGraph(MemberDef *md,int maxRecursionDepth)
m_maxDistance = 0;
m_recDepth = maxRecursionDepth;
m_diskName = md->getOutputFileBase()+"_"+md->anchor();
+ m_scope = md->getOuterScope();
QCString uniqueId;
uniqueId = md->getReference()+"$"+
md->getOutputFileBase()+"#"+md->anchor();
+ QCString name;
+ if (Config_getBool("HIDE_SCOPE_NAMES"))
+ {
+ name = md->name();
+ }
+ else
+ {
+ name = md->qualifiedName();
+ }
m_startNode = new DotNode(m_curNodeNumber++,
- md->qualifiedName(),
+ linkToText(name,FALSE),
uniqueId.data(),
0, // distance
TRUE // root node
@@ -2280,9 +2290,19 @@ void DotCallGraph::buildGraph(DotNode *n,MemberDef *md,int distance)
}
else
{
+ QCString name;
+ if (Config_getBool("HIDE_SCOPE_NAMES"))
+ {
+ name = rmd->getOuterScope()==m_scope ?
+ rmd->name() : rmd->qualifiedName();
+ }
+ else
+ {
+ name = rmd->qualifiedName();
+ }
bn = new DotNode(
m_curNodeNumber++,
- rmd->qualifiedName(),
+ linkToText(name,FALSE),
uniqueId,
distance
);
diff --git a/src/dot.h b/src/dot.h
index a70f561..4bb218f 100644
--- a/src/dot.h
+++ b/src/dot.h
@@ -30,6 +30,7 @@ class QTextStream;
class DotNodeList;
class ClassSDict;
class MemberDef;
+class Definition;
enum GraphOutputFormat { BITMAP , EPS };
@@ -197,6 +198,7 @@ class DotCallGraph
int m_maxDistance;
int m_recDepth;
QCString m_diskName;
+ Definition * m_scope;
};
void generateGraphLegend(const char *path);
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index 7fe82bb..82cac55 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -43,6 +43,7 @@
#include "tagreader.h"
#include "dot.h"
#include "docparser.h"
+#include "dirdef.h"
#include "outputlist.h"
#include "declinfo.h"
@@ -120,6 +121,7 @@ SDict<DefinitionList> *Doxygen::symbolMap;
bool Doxygen::outputToWizard=FALSE;
QDict<int> * Doxygen::htmlDirMap = 0;
QCache<LookupInfo> Doxygen::lookupCache(20000,20000);
+SDict<DirDef> Doxygen::directories(17);
static StringList inputFiles;
static StringDict excludeNameDict(1009); // sections
@@ -2731,7 +2733,8 @@ static void transferFunctionDocumentation()
mdef->getGroupPri(),
mdef->docFile(),
mdef->docLine(),
- mdef->hasDocumentation()
+ mdef->hasDocumentation(),
+ mdef
);
}
else if (mdef->getGroupDef()==0 && mdec->getGroupDef()!=0)
@@ -2740,7 +2743,8 @@ static void transferFunctionDocumentation()
mdec->getGroupPri(),
mdec->docFile(),
mdec->docLine(),
- mdec->hasDocumentation()
+ mdec->hasDocumentation(),
+ mdec
);
}
@@ -6683,13 +6687,14 @@ static void buildExampleList(Entry *root)
else
{
PageDef *pd=new PageDef(root->fileName,root->startLine,
- root->name,root->doc,root->args);
+ root->name,root->doc,root->args);
pd->setFileName(convertNameToFile(pd->name()+"-example"));
pd->addSectionsToDefinition(root->anchors);
//pi->addSections(root->anchors);
Doxygen::exampleSDict->inSort(root->name,pd);
- addExampleToGroups(root,pd);
+ //we don't add example to groups
+ //addExampleToGroups(root,pd);
}
}
}
@@ -8252,6 +8257,9 @@ void parseInput()
msg("Freeing input...\n");
input.resize(0);
+ //msg("Building directory list...\n");
+ //buildDirectories();
+
msg("Building group list...\n");
buildGroupList(root);
organizeSubGroups(root);
diff --git a/src/doxygen.h b/src/doxygen.h
index 404ac22..f746cbf 100644
--- a/src/doxygen.h
+++ b/src/doxygen.h
@@ -40,6 +40,7 @@ class PageSList;
class PageSDict;
class PageDef;
class SearchIndex;
+class DirDef;
typedef QList<QCString> StringList;
typedef QDict<FileDef> FileDict;
@@ -112,6 +113,7 @@ class Doxygen
static bool outputToWizard;
static QDict<int> *htmlDirMap;
static QCache<LookupInfo> lookupCache;
+ static SDict<DirDef> directories;
};
void initDoxygen();
diff --git a/src/filedef.cpp b/src/filedef.cpp
index 12c9872..a05a5f8 100644
--- a/src/filedef.cpp
+++ b/src/filedef.cpp
@@ -904,6 +904,7 @@ static void mergeFileDef(Directory *root,FileDef *fd)
dirNode->addChild(e);
}
+#if 0
static void generateIndent(QTextStream &t,DirEntry *de,int level)
{
if (de->parent())
@@ -949,7 +950,6 @@ static void generateIndent(QTextStream &t,DirEntry *de,int level)
}
}
-#if 0
static void writeDirTreeNode(QTextStream &t,Directory *root,int level)
{
QCString indent;
@@ -989,16 +989,17 @@ static void addDirsAsGroups(Directory *root,GroupDef *parent,int level)
{
gd = new GroupDef("<generated>",
1,
- root->name(), // name
+ root->path(), // name
root->name() // title
);
if (parent)
{
parent->addGroup(gd);
+ gd->makePartOfGroup(parent);
}
else
{
- Doxygen::groupSDict.append(root->name(),gd);
+ Doxygen::groupSDict.append(root->path(),gd);
}
}
QListIterator<DirEntry> dli(root->children());
diff --git a/src/filedef.h b/src/filedef.h
index c96f321..bceb878 100644
--- a/src/filedef.h
+++ b/src/filedef.h
@@ -38,6 +38,7 @@ class NamespaceDef;
class NamespaceSDict;
class MemberGroupSDict;
class PackageDef;
+class DirDef;
struct IncludeInfo
{
@@ -133,6 +134,9 @@ class FileDef : public Definition
void setPackageDef(PackageDef *pd) { package=pd; }
PackageDef *packageDef() const { return package; }
+ void setDirDef(DirDef *dd) { dir=dd; }
+ DirDef *getDirDef() const { return dir; }
+
void addUsingDirective(NamespaceDef *nd);
NamespaceSDict *getUsedNamespaces() const { return usingDirList; }
void addUsingDeclaration(Definition *def);
@@ -201,8 +205,8 @@ class FileDef : public Definition
QIntDict<MemberDef> *srcMemberDict;
bool isSource;
-
PackageDef *package;
+ DirDef *dir;
};
@@ -250,18 +254,23 @@ class DirEntry
public:
enum EntryKind { Dir, File };
DirEntry(DirEntry *parent,FileDef *fd)
- : m_parent(parent), m_kind(File), m_fd(fd), m_isLast(FALSE) { }
- DirEntry(DirEntry *parent)
- : m_parent(parent), m_kind(Dir), m_fd(0), m_isLast(FALSE) { }
+ : m_parent(parent), m_name(fd->name()), m_kind(File), m_fd(fd),
+ m_isLast(FALSE) { }
+ DirEntry(DirEntry *parent,QCString name)
+ : m_parent(parent), m_name(name), m_kind(Dir),
+ m_fd(0), m_isLast(FALSE) { }
virtual ~DirEntry() { }
EntryKind kind() const { return m_kind; }
FileDef *file() const { return m_fd; }
bool isLast() const { return m_isLast; }
void setLast(bool b) { m_isLast=b; }
DirEntry *parent() const { return m_parent; }
+ QCString name() const { return m_name; }
+ QCString path() const { return parent() ? parent()->path()+"/"+name() : name(); }
protected:
DirEntry *m_parent;
+ QCString m_name;
private:
EntryKind m_kind;
FileDef *m_fd;
@@ -273,17 +282,15 @@ class Directory : public DirEntry
{
public:
Directory(Directory *parent,const QCString &name)
- : DirEntry(parent), m_name(name)
+ : DirEntry(parent,name)
{ m_children.setAutoDelete(TRUE); }
virtual ~Directory() {}
void addChild(DirEntry *d) { m_children.append(d); d->setLast(TRUE); }
QList<DirEntry> &children() { return m_children; }
void rename(const QCString &name) { m_name=name; }
void reParent(Directory *parent) { m_parent=parent; }
- QCString name() const { return m_name; }
private:
- QCString m_name;
QList<DirEntry> m_children;
};
diff --git a/src/groupdef.cpp b/src/groupdef.cpp
index aa4ec5b..ff39df4 100644
--- a/src/groupdef.cpp
+++ b/src/groupdef.cpp
@@ -828,7 +828,8 @@ void addMemberToGroups(Entry *root,MemberDef *md)
if (success)
{
//printf("insertMember successful\n");
- md->setGroupDef(fgd,pri,root->fileName,root->startLine,!root->doc.isEmpty());
+ md->setGroupDef(fgd,pri,root->fileName,root->startLine,
+ !root->doc.isEmpty());
ClassDef *cd = md->getClassDefOfAnonymousType();
if (cd) cd->setGroupDefForAllMembers(fgd,pri,root->fileName,root->startLine,root->doc.length() != 0);
}
diff --git a/src/groupdef.h b/src/groupdef.h
index bedc064..879b2a2 100644
--- a/src/groupdef.h
+++ b/src/groupdef.h
@@ -119,8 +119,7 @@ class GroupDef : public Definition
FileList *fileList; // list of files in the group
ClassSDict *classSDict; // list of classes in the group
NamespaceList *namespaceList; // list of namespaces in the group
- GroupList *groupList; // list of sub groups.
- //GroupList *parentGroupList; // list of parent groups.
+ GroupList *groupList; // list of sub groups.
PageSDict *pageDict; // list of pages in the group
PageSDict *exampleDict; // list of examples in the group
diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp
index e6017ba..03a1759 100644
--- a/src/htmldocvisitor.cpp
+++ b/src/htmldocvisitor.cpp
@@ -29,6 +29,10 @@
#include "htmlgen.h"
+static const int NUM_HTML_LIST_TYPES = 4;
+static const char types[][NUM_HTML_LIST_TYPES] = {"1", "a", "i", "A"};
+
+
static QString htmlAttribsToString(const HtmlAttribList &attribs)
{
QString result;
@@ -327,12 +331,21 @@ void HtmlDocVisitor::visit(DocIndexEntry *)
// visitor functions for compound nodes
//--------------------------------------
+
void HtmlDocVisitor::visitPre(DocAutoList *l)
{
if (m_hide) return;
if (l->isEnumList())
{
- m_t << "<ol>";
+ //
+ // Do list type based on depth:
+ // 1.
+ // a.
+ // i.
+ // A.
+ // 1. (repeat)...
+ //
+ m_t << "<ol type=" << types[l->depth() % NUM_HTML_LIST_TYPES] << ">";
}
else
{
diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp
index a17c256..007827d 100644
--- a/src/htmlgen.cpp
+++ b/src/htmlgen.cpp
@@ -52,42 +52,37 @@ static const char *defaultStyleSheet =
"DIV.qindex {\n"
" width: 100%;\n"
" background-color: #eeeeff;\n"
-" border: 1px solid #B0B0B0;\n"
+" border: 1px solid #b0b0b0;\n"
" text-align: center;\n"
" margin: 2px;\n"
" padding: 2px;\n"
-" line-height: 120%;\n"
+" line-height: 140%;\n"
"}\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: 2px;\n"
"}\n"
"A.qindexHL {\n"
" text-decoration: none;\n"
" font-weight: bold;\n"
" background-color: #6666cc;\n"
" color: #ffffff;\n"
-" padding: 2px 6px;\n"
" border: 1px double #9295C2;\n"
"}\n"
"A.qindexHL:hover {\n"
" text-decoration: none;\n"
" background-color: #6666cc;\n"
" color: #ffffff;\n"
-" padding: 2px 6px;\n"
"}\n"
"A.qindexHL:visited { text-decoration: none; background-color: #6666cc; color: #ffffff }\n"
"A.el { text-decoration: none; font-weight: bold }\n"
@@ -359,9 +354,9 @@ void HtmlGenerator::writeFooterFile(QFile &file)
QTextStream t(&file);
t << "<hr size=\"1\"><address style=\"align: right;\"><small>\n";
t << theTranslator->trGeneratedAt( "$datetime", "$projectname" );
- t << " <a href=\"http://www.doxygen.org/index.html\">"
+ t << "&nbsp;<a href=\"http://www.doxygen.org/index.html\">"
<< "<img src=\"doxygen.png\" alt=\"doxygen\" "
- << "align=\"middle\" border=0>"
+ << "align=\"middle\" border=\"0\">"
<< "</a> $doxygenversion";
t << "</small></address>\n"
<< "</body>\n"
@@ -446,9 +441,9 @@ static void writePageFooter(QTextStream &t,const QCString &lastTitle,
dateToString(TRUE),
Config_getString("PROJECT_NAME")
);
- t << endl << "<a href=\"http://www.doxygen.org/index.html\">";
+ t << "&nbsp;" << endl << "<a href=\"http://www.doxygen.org/index.html\">";
t << endl << "<img src=\"" << relPath << "doxygen.png\" alt=\"doxygen\" "
- << "align=\"middle\" border=0 >" << "</a> " << versionString << " ";
+ << "align=\"middle\" border=\"0\">" << "</a> " << versionString << " ";
t << "</small></address>";
if (Debug::isFlagSet(Debug::Validate))
{
@@ -529,7 +524,7 @@ void HtmlGenerator::writeStyleInfo(int part)
void HtmlGenerator::startDoxyAnchor(const char *,const char *,
const char *anchor, const char *name)
{
- t << "<a class=\"anchor\" name=\"" << anchor << "\" doxytag=\"" << name << "\" ></a>";
+ t << "<a class=\"anchor\" name=\"" << anchor << "\" doxytag=\"" << name << "\"></a>";
}
void HtmlGenerator::endDoxyAnchor(const char *,const char *)
@@ -859,9 +854,9 @@ void HtmlGenerator::startMemberItem(int annoType)
t << "<tr>";
switch(annoType)
{
- case 0: t << "<td class=\"memItemLeft\" nowrap align=right valign=top>"; break;
+ case 0: t << "<td class=\"memItemLeft\" nowrap align=\"right\" valign=\"top\">"; break;
case 1: t << "<td class=\"memItemLeft\" nowrap>"; break;
- default: t << "<td class=\"memItemLeft\" nowrap valign=top>"; break;
+ default: t << "<td class=\"memItemLeft\" nowrap valign=\"top\">"; break;
}
}
else
@@ -886,7 +881,7 @@ void HtmlGenerator::insertMemberAlign()
DBG_HTML(t << "<!-- insertMemberAlign -->" << endl)
if (Config_getBool("HTML_ALIGN_MEMBERS"))
{
- t << "&nbsp;</td><td class=\"memItemRight\" valign=bottom>";
+ t << "&nbsp;</td><td class=\"memItemRight\" valign=\"bottom\">";
}
}
@@ -921,7 +916,7 @@ void HtmlGenerator::startMemberSections()
DBG_HTML(t << "<!-- startMemberSections -->" << endl)
if (Config_getBool("HTML_ALIGN_MEMBERS"))
{
- t << "<table border=0 cellpadding=0 cellspacing=0>" << endl;
+ t << "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">" << endl;
// HTML is not recursively decomposable, sorry
t << "<tr><td></td></tr>" << endl;
}
@@ -941,7 +936,7 @@ void HtmlGenerator::startMemberHeader()
DBG_HTML(t << "<!-- startMemberHeader -->" << endl)
if (Config_getBool("HTML_ALIGN_MEMBERS"))
{
- t << "<tr><td colspan=2><br><h2>";
+ t << "<tr><td colspan=\"2\"><br><h2>";
}
else
{
@@ -965,7 +960,7 @@ void HtmlGenerator::endMemberHeader()
void HtmlGenerator::startMemberSubtitle()
{
DBG_HTML(t << "<!-- startMemberSubtitle -->" << endl)
- if (Config_getBool("HTML_ALIGN_MEMBERS")) t << "<tr><td colspan=2>";
+ if (Config_getBool("HTML_ALIGN_MEMBERS")) t << "<tr><td colspan=\"2\">";
}
void HtmlGenerator::endMemberSubtitle()
@@ -1036,7 +1031,7 @@ void HtmlGenerator::startMemberDocName(bool align)
t << " <tr>" << endl;
t << " <td class=\"md\" nowrap valign=\"top\"";
if (align) t << " align=\"right\"";
- t << "> ";
+ t << ">";
}
void HtmlGenerator::endMemberDocName()
@@ -1213,7 +1208,7 @@ void HtmlGenerator::startIndent()
//t << "<div class=\"in\">" << endl;
- t << "<table cellspacing=5 cellpadding=0 border=0>\n"
+ t << "<table cellspacing=\"5\" cellpadding=\"0\" border=\"0\">\n"
" <tr>\n"
" <td>\n"
" &nbsp;\n"
diff --git a/src/htmlgen.h b/src/htmlgen.h
index 9371970..a58d986 100644
--- a/src/htmlgen.h
+++ b/src/htmlgen.h
@@ -172,11 +172,11 @@ class HtmlGenerator : public OutputGenerator
void writeNonBreakableSpace(int);
void startDescTable()
- { t << "<table border=0 cellspacing=2 cellpadding=0>" << endl; }
+ { t << "<table border=\"0\" cellspacing=\"2\" cellpadding=\"0\">" << endl; }
void endDescTable()
{ t << "</table>" << endl; }
void startDescTableTitle()
- { t << "<tr><td valign=top><em>"; }
+ { t << "<tr><td valign=\"top\"><em>"; }
void endDescTableTitle()
{ t << "</em>&nbsp;</td>"; }
void startDescTableData()
diff --git a/src/index.cpp b/src/index.cpp
index 77c01d6..72c8f64 100644
--- a/src/index.cpp
+++ b/src/index.cpp
@@ -544,31 +544,32 @@ void writeClassTree(BaseClassList *cl,int level)
void writeClassTreeNode(ClassDef *cd,bool hasHtmlHelp,bool hasFtvHelp,bool &started,int level)
{
- if (cd->isVisibleInHierarchy() && !cd->visited)
+ //printf("writeClassTreeNode(%s) visited=%d\n",cd->name().data(),cd->visited);
+ if (cd->isVisibleInHierarchy() && !cd->visited)
+ {
+ if (!started)
{
- if (!started)
+ started=TRUE;
+ }
+ bool hasChildren = classHasVisibleChildren(cd);
+ //printf("node: Has children %s: %d\n",cd->name().data(),hasChildren);
+ if (cd->isLinkable())
+ {
+ if (hasHtmlHelp)
{
- started=TRUE;
+ HtmlHelp::getInstance()->addContentsItem(hasChildren,cd->displayName(),cd->getOutputFileBase());
}
- bool hasChildren = classHasVisibleChildren(cd);
- //printf("node: Has children %s: %d\n",cd->name().data(),hasChildren);
- if (cd->isLinkable())
+ if (hasFtvHelp)
{
- if (hasHtmlHelp)
- {
- HtmlHelp::getInstance()->addContentsItem(hasChildren,cd->displayName(),cd->getOutputFileBase());
- }
- if (hasFtvHelp)
- {
- FTVHelp::getInstance()->addContentsItem(hasChildren,cd->getReference(),cd->getOutputFileBase(),0,cd->displayName());
- }
+ FTVHelp::getInstance()->addContentsItem(hasChildren,cd->getReference(),cd->getOutputFileBase(),0,cd->displayName());
}
- if (hasChildren)
- {
- writeClassTree(cd->subClasses(),level+1);
- }
- cd->visited=TRUE;
}
+ if (hasChildren)
+ {
+ writeClassTree(cd->subClasses(),level+1);
+ }
+ cd->visited=TRUE;
+ }
}
void writeClassTree(ClassList *cl,int level)
@@ -578,7 +579,11 @@ void writeClassTree(ClassList *cl,int level)
bool hasFtvHelp = generateHtml && Config_getBool("GENERATE_TREEVIEW");
ClassListIterator cli(*cl);
bool started=FALSE;
- for ( ; cli.current() ; ++cli)
+ for ( cli.toFirst() ; cli.current() ; ++cli)
+ {
+ cli.current()->visited=FALSE;
+ }
+ for ( cli.toFirst() ; cli.current() ; ++cli)
{
writeClassTreeNode(cli.current(),hasHtmlHelp,hasFtvHelp,started,level);
}
@@ -591,7 +596,11 @@ void writeClassTree(ClassSDict *d,int level)
bool hasFtvHelp = generateHtml && Config_getBool("GENERATE_TREEVIEW");
ClassSDict::Iterator cli(*d);
bool started=FALSE;
- for ( ; cli.current() ; ++cli)
+ for ( cli.toFirst() ; cli.current() ; ++cli)
+ {
+ cli.current()->visited=FALSE;
+ }
+ for ( cli.toFirst() ; cli.current() ; ++cli)
{
writeClassTreeNode(cli.current(),hasHtmlHelp,hasFtvHelp,started,level);
}
@@ -1356,7 +1365,7 @@ void writeAlphabeticalClassList(OutputList &ol)
alphaLinks += "</div><p>\n";
ol.writeString(alphaLinks);
- ol.writeString("<table align=center width=\"95%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n");
+ ol.writeString("<table align=\"center\" width=\"95%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n");
// the number of columns in the table
const int columns = Config_getInt("COLS_IN_ALPHA_INDEX");
@@ -2835,7 +2844,21 @@ void writeGroupTreeNode(OutputList &ol, GroupDef *gd,int level)
ftvHelp->incContentsDepth();
}
- writeClassTree(gd->classSDict,1);
+ ClassDef *cd;
+ ClassSDict::Iterator cdi(*gd->classSDict);
+ for (cdi.toFirst();(cd=cdi.current());++cdi)
+ {
+ if (cd->isLinkable())
+ {
+ //printf("node: Has children %s\n",cd->name().data());
+ if (htmlHelp)
+ htmlHelp->addContentsItem(FALSE,cd->displayName(),cd->getOutputFileBase());
+ if (ftvHelp)
+ ftvHelp->addContentsItem(FALSE,cd->getReference(),cd->getOutputFileBase(),0,cd->displayName());
+ }
+ }
+
+ //writeClassTree(gd->classSDict,1);
if(htmlHelp) htmlHelp->decContentsDepth();
if(ftvHelp) ftvHelp->decContentsDepth();
}
diff --git a/src/libdoxygen.pro.in b/src/libdoxygen.pro.in
index 5b65522..049cf1f 100644
--- a/src/libdoxygen.pro.in
+++ b/src/libdoxygen.pro.in
@@ -33,6 +33,7 @@ HEADERS = bufstr.h \
define.h \
definition.h \
diagram.h \
+ dirdef.h \
docparser.h \
doctokenizer.h \
docvisitor.h \
@@ -136,6 +137,7 @@ SOURCES = ce_lex.cpp \
define.cpp \
definition.cpp \
diagram.cpp \
+ dirdef.cpp \
docparser.cpp \
doctokenizer.cpp \
dot.cpp \
diff --git a/src/logos.cpp b/src/logos.cpp
index 4b55343..fb5b6b6 100644
--- a/src/logos.cpp
+++ b/src/logos.cpp
@@ -25,138 +25,113 @@
unsigned char doxygen_png_data[] = {
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x2d,
- 0x08, 0x03, 0x00, 0x00, 0x00, 0x6f, 0x6b, 0x3e, 0xc2, 0x00, 0x00, 0x03,
- 0x00, 0x50, 0x4c, 0x54, 0x45, 0xff, 0xff, 0xff, 0xbf, 0xbe, 0xa4, 0xf7,
- 0xe4, 0x8c, 0xff, 0xfe, 0xd8, 0xf4, 0xda, 0x6f, 0xda, 0xcb, 0x86, 0xf9,
- 0xeb, 0xa1, 0xde, 0xdb, 0xb4, 0x00, 0x00, 0x00, 0xb9, 0xab, 0x71, 0xdf,
- 0xdf, 0xc4, 0x5b, 0x51, 0x26, 0xff, 0xff, 0xe1, 0xd7, 0xc3, 0x6d, 0xae,
- 0x92, 0x2b, 0xd5, 0xbb, 0x57, 0xf1, 0xcd, 0x49, 0xee, 0xc4, 0x30, 0xd1,
- 0xad, 0x2d, 0x3d, 0x37, 0x1d, 0x67, 0x5e, 0x37, 0x60, 0x5f, 0x50, 0x40,
- 0x3f, 0x32, 0xfd, 0xf8, 0xc9, 0xfc, 0xf4, 0xbc, 0xdc, 0xd4, 0x9f, 0xfb,
- 0xf0, 0xaf, 0x1f, 0x1d, 0x13, 0xff, 0xcc, 0xcc, 0xdf, 0xb2, 0xb2, 0xa9,
- 0x22, 0x22, 0x12, 0x14, 0x3e, 0x20, 0x20, 0x20, 0x21, 0x21, 0x21, 0x22,
- 0x22, 0x22, 0x23, 0x23, 0x23, 0x24, 0x24, 0x24, 0x25, 0x25, 0x25, 0x26,
- 0x26, 0x26, 0x27, 0x27, 0x27, 0x28, 0x28, 0x28, 0x29, 0x29, 0x29, 0x2a,
- 0x2a, 0x2a, 0x2b, 0x2b, 0x2b, 0x2c, 0x2c, 0x2c, 0x2d, 0x2d, 0x2d, 0x2e,
- 0x2e, 0x2e, 0x2f, 0x2f, 0x2f, 0x30, 0x30, 0x30, 0x31, 0x31, 0x31, 0x32,
- 0x32, 0x32, 0x33, 0x33, 0x33, 0x34, 0x34, 0x34, 0x35, 0x35, 0x35, 0x36,
- 0x36, 0x36, 0x37, 0x37, 0x37, 0x38, 0x38, 0x38, 0x39, 0x39, 0x39, 0x3a,
- 0x3a, 0x3a, 0x3b, 0x3b, 0x3b, 0x3c, 0x3c, 0x3c, 0x3d, 0x3d, 0x3d, 0x3e,
- 0x3e, 0x3e, 0x3f, 0x3f, 0x3f, 0x40, 0x40, 0x40, 0x41, 0x41, 0x41, 0x42,
- 0x42, 0x42, 0x43, 0x43, 0x43, 0x44, 0x44, 0x44, 0x45, 0x45, 0x45, 0x46,
- 0x46, 0x46, 0x47, 0x47, 0x47, 0x48, 0x48, 0x48, 0x49, 0x49, 0x49, 0x4a,
- 0x4a, 0x4a, 0x4b, 0x4b, 0x4b, 0x4c, 0x4c, 0x4c, 0x4d, 0x4d, 0x4d, 0x4e,
- 0x4e, 0x4e, 0x4f, 0x4f, 0x4f, 0x50, 0x50, 0x50, 0x51, 0x51, 0x51, 0x52,
- 0x52, 0x52, 0x53, 0x53, 0x53, 0x54, 0x54, 0x54, 0x55, 0x55, 0x55, 0x56,
- 0x56, 0x56, 0x57, 0x57, 0x57, 0x58, 0x58, 0x58, 0x59, 0x59, 0x59, 0x5a,
- 0x5a, 0x5a, 0x5b, 0x5b, 0x5b, 0x5c, 0x5c, 0x5c, 0x5d, 0x5d, 0x5d, 0x5e,
- 0x5e, 0x5e, 0x5f, 0x5f, 0x5f, 0x60, 0x60, 0x60, 0x61, 0x61, 0x61, 0x62,
- 0x62, 0x62, 0x63, 0x63, 0x63, 0x64, 0x64, 0x64, 0x65, 0x65, 0x65, 0x66,
- 0x66, 0x66, 0x67, 0x67, 0x67, 0x68, 0x68, 0x68, 0x69, 0x69, 0x69, 0x6a,
- 0x6a, 0x6a, 0x6b, 0x6b, 0x6b, 0x6c, 0x6c, 0x6c, 0x6d, 0x6d, 0x6d, 0x6e,
- 0x6e, 0x6e, 0x6f, 0x6f, 0x6f, 0x70, 0x70, 0x70, 0x71, 0x71, 0x71, 0x72,
- 0x72, 0x72, 0x73, 0x73, 0x73, 0x74, 0x74, 0x74, 0x75, 0x75, 0x75, 0x76,
- 0x76, 0x76, 0x77, 0x77, 0x77, 0x78, 0x78, 0x78, 0x79, 0x79, 0x79, 0x7a,
- 0x7a, 0x7a, 0x7b, 0x7b, 0x7b, 0x7c, 0x7c, 0x7c, 0x7d, 0x7d, 0x7d, 0x7e,
- 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x80, 0x80, 0x80, 0x81, 0x81, 0x81, 0x82,
- 0x82, 0x82, 0x83, 0x83, 0x83, 0x84, 0x84, 0x84, 0x85, 0x85, 0x85, 0x86,
- 0x86, 0x86, 0x87, 0x87, 0x87, 0x88, 0x88, 0x88, 0x89, 0x89, 0x89, 0x8a,
- 0x8a, 0x8a, 0x8b, 0x8b, 0x8b, 0x8c, 0x8c, 0x8c, 0x8d, 0x8d, 0x8d, 0x8e,
- 0x8e, 0x8e, 0x8f, 0x8f, 0x8f, 0x90, 0x90, 0x90, 0x91, 0x91, 0x91, 0x92,
- 0x92, 0x92, 0x93, 0x93, 0x93, 0x94, 0x94, 0x94, 0x95, 0x95, 0x95, 0x96,
- 0x96, 0x96, 0x97, 0x97, 0x97, 0x98, 0x98, 0x98, 0x99, 0x99, 0x99, 0x9a,
- 0x9a, 0x9a, 0x9b, 0x9b, 0x9b, 0x9c, 0x9c, 0x9c, 0x9d, 0x9d, 0x9d, 0x9e,
- 0x9e, 0x9e, 0x9f, 0x9f, 0x9f, 0xa0, 0xa0, 0xa0, 0xa1, 0xa1, 0xa1, 0xa2,
- 0xa2, 0xa2, 0xa3, 0xa3, 0xa3, 0xa4, 0xa4, 0xa4, 0xa5, 0xa5, 0xa5, 0xa6,
- 0xa6, 0xa6, 0xa7, 0xa7, 0xa7, 0xa8, 0xa8, 0xa8, 0xa9, 0xa9, 0xa9, 0xaa,
- 0xaa, 0xaa, 0xab, 0xab, 0xab, 0xac, 0xac, 0xac, 0xad, 0xad, 0xad, 0xae,
- 0xae, 0xae, 0xaf, 0xaf, 0xaf, 0xb0, 0xb0, 0xb0, 0xb1, 0xb1, 0xb1, 0xb2,
- 0xb2, 0xb2, 0xb3, 0xb3, 0xb3, 0xb4, 0xb4, 0xb4, 0xb5, 0xb5, 0xb5, 0xb6,
- 0xb6, 0xb6, 0xb7, 0xb7, 0xb7, 0xb8, 0xb8, 0xb8, 0xb9, 0xb9, 0xb9, 0xba,
- 0xba, 0xba, 0xbb, 0xbb, 0xbb, 0xbc, 0xbc, 0xbc, 0xbd, 0xbd, 0xbd, 0xbe,
- 0xbe, 0xbe, 0xbf, 0xbf, 0xbf, 0xc0, 0xc0, 0xc0, 0xc1, 0xc1, 0xc1, 0xc2,
- 0xc2, 0xc2, 0xc3, 0xc3, 0xc3, 0xc4, 0xc4, 0xc4, 0xc5, 0xc5, 0xc5, 0xc6,
- 0xc6, 0xc6, 0xc7, 0xc7, 0xc7, 0xc8, 0xc8, 0xc8, 0xc9, 0xc9, 0xc9, 0xca,
- 0xca, 0xca, 0xcb, 0xcb, 0xcb, 0xcc, 0xcc, 0xcc, 0xcd, 0xcd, 0xcd, 0xce,
- 0xce, 0xce, 0xcf, 0xcf, 0xcf, 0xd0, 0xd0, 0xd0, 0xd1, 0xd1, 0xd1, 0xd2,
- 0xd2, 0xd2, 0xd3, 0xd3, 0xd3, 0xd4, 0xd4, 0xd4, 0xd5, 0xd5, 0xd5, 0xd6,
- 0xd6, 0xd6, 0xd7, 0xd7, 0xd7, 0xd8, 0xd8, 0xd8, 0xd9, 0xd9, 0xd9, 0xda,
- 0xda, 0xda, 0xdb, 0xdb, 0xdb, 0xdc, 0xdc, 0xdc, 0xdd, 0xdd, 0xdd, 0xde,
- 0xde, 0xde, 0xdf, 0xdf, 0xdf, 0xe0, 0xe0, 0xe0, 0xe1, 0xe1, 0xe1, 0xe2,
- 0xe2, 0xe2, 0xe3, 0xe3, 0xe3, 0xe4, 0xe4, 0xe4, 0xe5, 0xe5, 0xe5, 0xe6,
- 0xe6, 0xe6, 0xe7, 0xe7, 0xe7, 0xe8, 0xe8, 0xe8, 0xe9, 0xe9, 0xe9, 0xea,
- 0xea, 0xea, 0xeb, 0xeb, 0xeb, 0xec, 0xec, 0xec, 0xed, 0xed, 0xed, 0xee,
- 0xee, 0xee, 0xef, 0xef, 0xef, 0xf0, 0xf0, 0xf0, 0xf1, 0xf1, 0xf1, 0xf2,
- 0xf2, 0xf2, 0xf3, 0xf3, 0xf3, 0xf4, 0xf4, 0xf4, 0xf5, 0xf5, 0xf5, 0xf6,
- 0xf6, 0xf6, 0xf7, 0xf7, 0xf7, 0xf8, 0xf8, 0xf8, 0xf9, 0xf9, 0xf9, 0xfa,
- 0xfa, 0xfa, 0xfb, 0xfb, 0xfb, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xfe,
- 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xaf, 0x33, 0xef, 0x22, 0x00, 0x00, 0x00,
- 0x01, 0x74, 0x52, 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, 0x00, 0x00,
- 0x00, 0x01, 0x62, 0x4b, 0x47, 0x44, 0x00, 0x88, 0x05, 0x1d, 0x48, 0x00,
- 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x6e, 0xbd, 0x00,
- 0x00, 0x6e, 0xbd, 0x01, 0x84, 0x9a, 0x17, 0x68, 0x00, 0x00, 0x00, 0x07,
- 0x74, 0x49, 0x4d, 0x45, 0x07, 0xd3, 0x0a, 0x08, 0x15, 0x0b, 0x1c, 0x3a,
- 0x62, 0x10, 0x70, 0x00, 0x00, 0x02, 0xa1, 0x49, 0x44, 0x41, 0x54, 0x78,
- 0xda, 0xed, 0x56, 0x6b, 0x8f, 0xda, 0x30, 0x10, 0xc4, 0x0d, 0x69, 0xd6,
- 0xce, 0x03, 0x88, 0x89, 0x4b, 0xf0, 0xd1, 0xff, 0xff, 0x33, 0xbb, 0xb3,
- 0x6b, 0xc7, 0x86, 0x0f, 0x77, 0x42, 0x3a, 0x2a, 0xb5, 0x62, 0x25, 0xf0,
- 0xcc, 0xbe, 0xc6, 0x31, 0xc9, 0x86, 0xdd, 0xae, 0x18, 0xa9, 0xed, 0x5e,
- 0x6a, 0x64, 0x9c, 0x73, 0xe6, 0xd5, 0x22, 0xae, 0x69, 0x1a, 0xf7, 0x16,
- 0x79, 0x8b, 0xfc, 0xc3, 0x22, 0xc3, 0x5f, 0x11, 0x19, 0x86, 0xd7, 0x89,
- 0xa4, 0x81, 0x92, 0x45, 0x88, 0xca, 0x84, 0xa9, 0x97, 0x32, 0x74, 0x2a,
- 0x6f, 0x99, 0x45, 0x05, 0xd3, 0x7d, 0x40, 0x83, 0x98, 0x27, 0x6c, 0x83,
- 0x8a, 0x64, 0x8a, 0x11, 0x03, 0xac, 0x8b, 0x59, 0x68, 0x31, 0x69, 0xea,
- 0xa8, 0x77, 0xab, 0xd3, 0x94, 0xcc, 0x4c, 0xe5, 0xdf, 0xa6, 0x14, 0xbb,
- 0x86, 0x62, 0x8e, 0x82, 0xd9, 0xb0, 0x11, 0xec, 0x42, 0x0c, 0x0e, 0x11,
- 0x4e, 0x94, 0xd3, 0x24, 0xf5, 0x56, 0x75, 0x8e, 0xaa, 0x2e, 0x86, 0xaa,
- 0x86, 0x49, 0xa5, 0x76, 0x49, 0xab, 0xa1, 0x4e, 0x91, 0xef, 0x45, 0x0f,
- 0xd2, 0x69, 0x11, 0x59, 0x01, 0xe1, 0xae, 0x95, 0x54, 0xe5, 0xc3, 0x70,
- 0xc3, 0x83, 0x4a, 0x6a, 0x9a, 0x4e, 0x2b, 0x67, 0x6c, 0x87, 0xa7, 0xc5,
- 0xf8, 0x2c, 0x7a, 0x01, 0x94, 0x6e, 0x90, 0x20, 0x22, 0x9a, 0xe7, 0x28,
- 0x6d, 0xa0, 0xda, 0x8d, 0x56, 0xa5, 0x3b, 0x49, 0x9e, 0x8e, 0xc6, 0xf0,
- 0x91, 0x98, 0x46, 0x9e, 0x93, 0x3b, 0xca, 0xfb, 0x6d, 0xd4, 0x4c, 0x24,
- 0xc1, 0xbc, 0x69, 0x0d, 0x18, 0xf9, 0xf6, 0x70, 0x3a, 0xf1, 0xe1, 0xcc,
- 0xb4, 0x85, 0xb6, 0x5c, 0x5c, 0x93, 0x1e, 0x3c, 0xf5, 0x77, 0x81, 0x28,
- 0x86, 0x0e, 0x88, 0x12, 0xa5, 0x44, 0x4d, 0xd2, 0x80, 0x0b, 0xb8, 0x5b,
- 0xc4, 0x1f, 0x62, 0x97, 0xca, 0x0c, 0xb2, 0xc4, 0xb7, 0x68, 0x2f, 0x43,
- 0x25, 0x03, 0x31, 0x16, 0xe9, 0x7e, 0xb1, 0x75, 0x91, 0x5b, 0x44, 0xc0,
- 0x8e, 0x1e, 0x68, 0xd0, 0x84, 0x85, 0x44, 0x17, 0x10, 0x9c, 0x6f, 0xa1,
- 0x0e, 0xde, 0xc8, 0x22, 0xc8, 0xd2, 0x24, 0x89, 0x04, 0x09, 0x71, 0x8f,
- 0xa8, 0x4e, 0x11, 0xb9, 0xb0, 0xad, 0xd2, 0x75, 0x05, 0xa2, 0x07, 0x1a,
- 0xb0, 0x5c, 0x2e, 0x46, 0x5c, 0xe6, 0xa2, 0xb6, 0x72, 0x27, 0x60, 0xb3,
- 0x44, 0xc4, 0x3b, 0x5a, 0x73, 0x80, 0x3d, 0x24, 0x6c, 0x8d, 0xd2, 0x80,
- 0x3b, 0xe0, 0xb8, 0xae, 0x6c, 0xab, 0x9c, 0xcf, 0x0a, 0x44, 0x42, 0x79,
- 0x87, 0x42, 0x6d, 0xb0, 0xd7, 0xeb, 0x96, 0xa1, 0x29, 0x70, 0x03, 0x23,
- 0xb2, 0xae, 0x5a, 0xa4, 0x59, 0xab, 0x5d, 0x16, 0x6b, 0x03, 0x89, 0x8f,
- 0x45, 0xc4, 0x27, 0x3f, 0x7c, 0xfb, 0x93, 0xcd, 0xf2, 0x2f, 0x6d, 0x01,
- 0x5a, 0xe1, 0xf6, 0xac, 0xb4, 0x55, 0xa7, 0x66, 0xe0, 0x52, 0x94, 0xb6,
- 0xf2, 0x30, 0x87, 0x36, 0xc7, 0x56, 0xc5, 0xed, 0xf9, 0x6c, 0x79, 0xb5,
- 0xd2, 0xa2, 0x8d, 0xb1, 0xd5, 0x5c, 0x88, 0xd8, 0x1f, 0xb0, 0xb6, 0x6d,
- 0x75, 0x55, 0x9e, 0xa8, 0xf5, 0x4a, 0x14, 0x73, 0x63, 0xaf, 0x50, 0x47,
- 0x86, 0xd5, 0x12, 0x14, 0x45, 0x5b, 0x12, 0x79, 0x9f, 0xf8, 0x66, 0x11,
- 0x65, 0xbb, 0xa2, 0x92, 0x6c, 0xa4, 0x3e, 0xa1, 0xfd, 0x7e, 0x3f, 0xf6,
- 0x23, 0x5c, 0xde, 0x8f, 0xda, 0x9a, 0x0f, 0x51, 0x1c, 0x79, 0x30, 0x79,
- 0x3b, 0x8e, 0xda, 0x88, 0xaa, 0x2e, 0x23, 0x49, 0x52, 0x94, 0x5c, 0x66,
- 0xfa, 0xc8, 0xdb, 0xfd, 0x66, 0xa3, 0x45, 0x65, 0x26, 0x3d, 0x01, 0xda,
- 0x18, 0x91, 0x31, 0x4e, 0x22, 0x02, 0x47, 0x35, 0x00, 0xbd, 0x84, 0xe4,
- 0xba, 0xc6, 0xad, 0x05, 0x10, 0x44, 0x84, 0x26, 0x91, 0x7e, 0x3a, 0x68,
- 0xfc, 0x30, 0xf5, 0x3e, 0x46, 0xdf, 0x2b, 0x3d, 0xf4, 0x31, 0x32, 0xcc,
- 0xcb, 0xe4, 0x59, 0xc4, 0x73, 0xe8, 0x90, 0xfb, 0x4f, 0x38, 0x40, 0x24,
- 0x8f, 0x67, 0x50, 0x2d, 0x43, 0x14, 0xe0, 0xe0, 0x7d, 0xe2, 0x32, 0x83,
- 0xed, 0x47, 0xb1, 0x9b, 0x58, 0x05, 0x6f, 0x09, 0xc9, 0x62, 0x69, 0x3a,
- 0x1e, 0x8f, 0x13, 0x31, 0xbd, 0xdd, 0x18, 0x4f, 0x3e, 0x7a, 0x78, 0x0e,
- 0x54, 0xca, 0x3e, 0x4a, 0xbd, 0x2e, 0xb8, 0x85, 0x7f, 0x3f, 0x63, 0x34,
- 0x73, 0xcb, 0x54, 0x42, 0x0c, 0xe7, 0x19, 0x0e, 0x16, 0xf9, 0xac, 0x06,
- 0xaf, 0x81, 0xa7, 0x34, 0x4e, 0xa7, 0xd3, 0x9c, 0x45, 0x4e, 0x9b, 0xcd,
- 0x9f, 0x36, 0xb9, 0x7f, 0x8b, 0x7d, 0x6d, 0x10, 0x39, 0x67, 0x32, 0x65,
- 0x8d, 0xe9, 0x8b, 0xaa, 0x27, 0x5f, 0xd3, 0x13, 0x76, 0x5d, 0xd8, 0x2c,
- 0x97, 0x31, 0x7d, 0xf3, 0xdf, 0x02, 0xee, 0x5b, 0xb5, 0xe4, 0x8b, 0x99,
- 0x99, 0x7f, 0xfb, 0x5f, 0x8f, 0x18, 0xe3, 0xe3, 0x3f, 0x90, 0xdd, 0xdb,
- 0xde, 0xf6, 0xb6, 0xb7, 0xfd, 0x97, 0xf6, 0x07, 0x2e, 0xfb, 0x61, 0xc1,
- 0xcc, 0x44, 0x36, 0x49, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44,
- 0xae, 0x42, 0x60, 0x82
+ 0x08, 0x03, 0x00, 0x00, 0x00, 0x6f, 0x6b, 0x3e, 0xc2, 0x00, 0x00, 0x00,
+ 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x00, 0xd6, 0xd8, 0xd4, 0x4f, 0x58,
+ 0x32, 0x00, 0x00, 0x00, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66,
+ 0x74, 0x77, 0x61, 0x72, 0x65, 0x00, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20,
+ 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x71, 0xc9,
+ 0x65, 0x3c, 0x00, 0x00, 0x00, 0x5d, 0x50, 0x4c, 0x54, 0x45, 0x00, 0x00,
+ 0x00, 0xc7, 0xbe, 0xcf, 0x22, 0x26, 0xa9, 0xc8, 0xce, 0xef, 0xb6, 0xbb,
+ 0xd6, 0xd3, 0xda, 0xfa, 0x93, 0xa2, 0xde, 0xa0, 0xac, 0xe0, 0xb6, 0xc2,
+ 0xf5, 0x7f, 0x87, 0xa7, 0xd5, 0xd9, 0xea, 0xc9, 0xca, 0xce, 0xe1, 0xe2,
+ 0xe6, 0x7b, 0x8e, 0xd4, 0x8d, 0xa1, 0xeb, 0x88, 0x99, 0xd7, 0xa0, 0xb2,
+ 0xf8, 0xa7, 0xac, 0xb9, 0xc0, 0xc0, 0xb1, 0xdd, 0xdd, 0xce, 0xf9, 0xf9,
+ 0xe9, 0xf5, 0xf5, 0xe7, 0xeb, 0xeb, 0xe5, 0x45, 0x44, 0x39, 0xd7, 0xd6,
+ 0xcb, 0x68, 0x67, 0x5d, 0x1f, 0x1d, 0x13, 0x5f, 0x58, 0x3c, 0x40, 0x3a,
+ 0x23, 0x6d, 0x68, 0x55, 0xff, 0xff, 0xff, 0xdd, 0xc0, 0x7f, 0x31, 0x00,
+ 0x00, 0x00, 0x1f, 0x74, 0x52, 0x4e, 0x53, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0x00, 0xcd, 0x19, 0x76, 0x10, 0x00, 0x00, 0x03, 0xff, 0x49, 0x44,
+ 0x41, 0x54, 0x78, 0xda, 0x62, 0x90, 0x43, 0x00, 0x06, 0x08, 0x90, 0xa3,
+ 0x3a, 0x00, 0x08, 0x20, 0x64, 0x23, 0x19, 0x84, 0x84, 0x85, 0x85, 0x85,
+ 0x68, 0x60, 0x09, 0x40, 0x00, 0xa1, 0x58, 0x22, 0x2c, 0x2a, 0x2a, 0x2a,
+ 0x4c, 0x03, 0x4b, 0x00, 0x02, 0x88, 0x2e, 0x96, 0x00, 0x04, 0x10, 0x5d,
+ 0x2c, 0x01, 0x08, 0x20, 0xba, 0x58, 0x02, 0x10, 0x40, 0x74, 0xb1, 0x04,
+ 0x20, 0x80, 0xe8, 0x62, 0x09, 0x40, 0x00, 0xd1, 0xc5, 0x12, 0x80, 0x00,
+ 0x42, 0xb5, 0x44, 0x84, 0x36, 0x96, 0x00, 0x04, 0x10, 0x9a, 0x25, 0x22,
+ 0x22, 0xb4, 0xb0, 0x04, 0x20, 0x80, 0x18, 0x90, 0x0b, 0x14, 0x98, 0x25,
+ 0x0c, 0x0c, 0x88, 0x12, 0x06, 0x99, 0x42, 0x14, 0x3a, 0x48, 0xa2, 0x88,
+ 0xb2, 0x08, 0xc1, 0x66, 0x40, 0x95, 0x00, 0x08, 0x20, 0x88, 0x52, 0x50,
+ 0x79, 0x02, 0x04, 0x22, 0x10, 0x4b, 0x60, 0x5c, 0x50, 0x11, 0x03, 0x62,
+ 0x43, 0x28, 0x21, 0x49, 0x06, 0x49, 0x21, 0x68, 0xa9, 0x03, 0x11, 0x85,
+ 0xeb, 0x83, 0x28, 0x81, 0xf1, 0x84, 0x90, 0xc4, 0x21, 0xea, 0x01, 0x02,
+ 0x88, 0x01, 0xac, 0x43, 0x04, 0x01, 0x84, 0x19, 0xc4, 0x85, 0xe0, 0x6c,
+ 0x21, 0x30, 0x5b, 0x58, 0x5c, 0x4a, 0x5c, 0x18, 0x24, 0x03, 0x54, 0x08,
+ 0x0e, 0x4d, 0x06, 0x88, 0x28, 0x92, 0x3e, 0x61, 0x06, 0x24, 0x53, 0x84,
+ 0x18, 0x90, 0x0c, 0x04, 0xd9, 0x02, 0x10, 0x40, 0x0c, 0xd0, 0xa8, 0x40,
+ 0x52, 0x2e, 0x24, 0x82, 0xac, 0x04, 0x4c, 0x4a, 0x42, 0x02, 0x52, 0x18,
+ 0xa2, 0x89, 0x41, 0x10, 0xcc, 0x10, 0x47, 0x31, 0x0a, 0xac, 0x0b, 0x16,
+ 0x18, 0xc2, 0x28, 0x46, 0xc8, 0x01, 0x04, 0x10, 0x83, 0x1c, 0xd4, 0x50,
+ 0x68, 0x68, 0xc1, 0x54, 0xc0, 0x03, 0x0f, 0xa2, 0x19, 0x84, 0x25, 0x21,
+ 0x1e, 0x60, 0x80, 0x26, 0x10, 0x71, 0xb0, 0x25, 0x10, 0x75, 0xc2, 0x0c,
+ 0x50, 0x07, 0x20, 0xb9, 0x06, 0xa2, 0x0b, 0xac, 0x01, 0x20, 0x80, 0x18,
+ 0x20, 0xb9, 0x43, 0x54, 0x08, 0x18, 0x24, 0x42, 0xa2, 0xe0, 0x7c, 0x82,
+ 0xc2, 0x05, 0xba, 0x57, 0x14, 0x02, 0x84, 0xa4, 0x18, 0xc0, 0x6c, 0xa0,
+ 0xa3, 0x21, 0x12, 0x42, 0x60, 0x52, 0x06, 0x24, 0x28, 0x0c, 0x16, 0x03,
+ 0x85, 0x19, 0xc4, 0x08, 0x88, 0x91, 0x92, 0xc2, 0x10, 0x9e, 0x1c, 0x40,
+ 0x00, 0x41, 0xc5, 0x25, 0xc4, 0x19, 0x18, 0xa4, 0xc4, 0x25, 0x40, 0x2c,
+ 0x06, 0x28, 0x97, 0x01, 0xca, 0x15, 0x82, 0xda, 0x01, 0x12, 0x02, 0xb1,
+ 0x25, 0x24, 0xc1, 0xe2, 0xe2, 0x52, 0x12, 0x50, 0x6d, 0x42, 0x20, 0x55,
+ 0x60, 0x31, 0x49, 0x88, 0x59, 0x42, 0x0c, 0x08, 0x15, 0x20, 0x39, 0x39,
+ 0x80, 0x00, 0x5c, 0x8d, 0x31, 0x02, 0x00, 0x20, 0x08, 0x02, 0x79, 0x43,
+ 0x43, 0x12, 0x43, 0xff, 0x7f, 0x66, 0x22, 0x5b, 0x4e, 0xa0, 0x27, 0x00,
+ 0xdc, 0x3d, 0x54, 0x47, 0xc8, 0x92, 0xf8, 0x6c, 0x05, 0x38, 0x98, 0x5e,
+ 0x4b, 0xfb, 0x35, 0x8f, 0x3c, 0xea, 0x12, 0x53, 0x81, 0xe6, 0x52, 0xc9,
+ 0xa4, 0x94, 0x25, 0xee, 0x13, 0x40, 0x40, 0x01, 0x1e, 0x20, 0xe0, 0x06,
+ 0x9b, 0xca, 0x0d, 0x62, 0x31, 0xa0, 0x71, 0xc5, 0x41, 0x14, 0x0f, 0x8f,
+ 0x10, 0x58, 0x48, 0x88, 0x07, 0x02, 0xb8, 0x81, 0x26, 0x81, 0xd8, 0x42,
+ 0x92, 0x52, 0x20, 0x79, 0x09, 0x06, 0x6e, 0x98, 0x04, 0x50, 0x84, 0x01,
+ 0xcc, 0xe3, 0x96, 0x02, 0x1b, 0x00, 0x34, 0x41, 0x0e, 0x20, 0x80, 0x80,
+ 0x6a, 0xb9, 0x80, 0x80, 0x1b, 0x1c, 0x3e, 0xdc, 0x20, 0x16, 0x03, 0x98,
+ 0x0b, 0x74, 0x21, 0x98, 0x2b, 0x28, 0x2e, 0xc8, 0xc5, 0x05, 0x57, 0x01,
+ 0x51, 0x02, 0x12, 0x06, 0xb1, 0x41, 0x32, 0xdc, 0xdc, 0x10, 0x4d, 0x10,
+ 0x55, 0xdc, 0x82, 0x92, 0x92, 0x82, 0x82, 0xe2, 0x0c, 0x60, 0x31, 0xa0,
+ 0x25, 0x60, 0x31, 0x06, 0x39, 0x80, 0x00, 0x02, 0x46, 0x3c, 0x0b, 0x33,
+ 0x10, 0x08, 0x02, 0x63, 0x5a, 0x10, 0xc4, 0x60, 0x01, 0xf3, 0x05, 0x65,
+ 0x21, 0x5c, 0x16, 0x88, 0x20, 0x44, 0x05, 0xc8, 0x2b, 0x10, 0x2e, 0x0b,
+ 0x38, 0x33, 0x8b, 0xb3, 0xc0, 0xe4, 0xb8, 0x21, 0x6c, 0x16, 0x59, 0x59,
+ 0x41, 0x20, 0x2d, 0x08, 0x36, 0x82, 0x45, 0x4a, 0x8a, 0x05, 0xa2, 0x56,
+ 0x0e, 0x20, 0x80, 0x40, 0xa9, 0x9e, 0x03, 0x04, 0x58, 0x58, 0x58, 0x20,
+ 0x34, 0x84, 0x0f, 0xe5, 0x0a, 0xca, 0x40, 0x38, 0x10, 0x36, 0xd0, 0x60,
+ 0x19, 0x08, 0x13, 0x52, 0x64, 0x08, 0x42, 0xb4, 0x80, 0x34, 0x49, 0x09,
+ 0x22, 0x14, 0x02, 0xdd, 0x09, 0x22, 0x81, 0x96, 0x40, 0x78, 0x72, 0x00,
+ 0x01, 0x04, 0xca, 0x8c, 0x82, 0x1c, 0x48, 0x80, 0x9d, 0x41, 0x1a, 0xca,
+ 0x12, 0x10, 0x10, 0x60, 0x97, 0x66, 0x07, 0x09, 0xc9, 0xc8, 0xb0, 0x43,
+ 0x8c, 0x06, 0x06, 0x22, 0x58, 0x00, 0x56, 0x30, 0xc9, 0x08, 0xb2, 0xb3,
+ 0x43, 0x0c, 0x62, 0x40, 0x32, 0x85, 0x9d, 0x01, 0xac, 0x48, 0x0a, 0xac,
+ 0x16, 0xc8, 0x93, 0x03, 0x08, 0x20, 0x70, 0x29, 0x21, 0x28, 0x00, 0x07,
+ 0xec, 0x82, 0x20, 0x9d, 0x30, 0x8e, 0x34, 0x03, 0x88, 0x29, 0x28, 0x25,
+ 0x05, 0x52, 0xc1, 0xce, 0x09, 0xb6, 0x04, 0x24, 0x80, 0x54, 0x00, 0xca,
+ 0x80, 0xa5, 0xc0, 0xfe, 0x62, 0x87, 0x1b, 0x01, 0x62, 0x81, 0x2c, 0x01,
+ 0x73, 0x19, 0xe4, 0x00, 0x02, 0xd0, 0x40, 0x06, 0x37, 0x00, 0xc0, 0x20,
+ 0x08, 0xfc, 0xd1, 0xb0, 0x82, 0xd2, 0xee, 0x3f, 0x66, 0xa5, 0xd6, 0x97,
+ 0x5c, 0x50, 0x49, 0x78, 0x21, 0x49, 0xb4, 0x0f, 0xa6, 0x22, 0x94, 0x8d,
+ 0xc8, 0x88, 0x92, 0x33, 0xa8, 0x0a, 0x51, 0x59, 0x98, 0xff, 0x74, 0x81,
+ 0x5e, 0x5e, 0xdb, 0xd8, 0x67, 0x76, 0x2d, 0x20, 0x7d, 0x3e, 0x57, 0x00,
+ 0x81, 0x4a, 0x4f, 0x41, 0x56, 0x04, 0x60, 0x04, 0x03, 0x24, 0x26, 0x23,
+ 0x94, 0x05, 0xa6, 0x04, 0x19, 0x38, 0xf9, 0xf8, 0xf8, 0x38, 0x19, 0x80,
+ 0x5c, 0x46, 0x46, 0x20, 0x9b, 0x53, 0x46, 0x4a, 0x06, 0x24, 0xc2, 0xc6,
+ 0x80, 0xd0, 0xc6, 0x8a, 0xd0, 0x0f, 0xa1, 0x18, 0xe4, 0x00, 0x02, 0x88,
+ 0x81, 0x81, 0x89, 0x14, 0xc0, 0xc0, 0x0b, 0x34, 0x12, 0xaa, 0x85, 0x01,
+ 0xc8, 0xe4, 0xe5, 0x05, 0x09, 0x00, 0x2d, 0xc1, 0xa7, 0x87, 0x01, 0x20,
+ 0x80, 0x18, 0x48, 0xb2, 0x85, 0x81, 0x97, 0x9f, 0x9f, 0x9f, 0x17, 0x66,
+ 0x09, 0x3f, 0x1c, 0xf0, 0xe2, 0x35, 0x84, 0x01, 0x20, 0x80, 0x18, 0x90,
+ 0x6b, 0x31, 0xc2, 0x00, 0x64, 0x89, 0x2c, 0x8c, 0xc3, 0x09, 0xb3, 0x83,
+ 0x93, 0x80, 0x2e, 0x80, 0x00, 0x22, 0xad, 0x46, 0x07, 0x99, 0xcb, 0xcb,
+ 0x80, 0xe0, 0xf1, 0x82, 0xbd, 0xc1, 0x49, 0xc8, 0x10, 0x80, 0x00, 0x22,
+ 0xb1, 0xd9, 0x00, 0x34, 0x17, 0xc9, 0x48, 0xa0, 0x67, 0x78, 0x81, 0x7c,
+ 0x82, 0x66, 0x00, 0x04, 0x10, 0xa9, 0x6d, 0x13, 0x29, 0x29, 0x29, 0x39,
+ 0xb4, 0x2e, 0x0d, 0x61, 0x4d, 0x00, 0x01, 0x44, 0x83, 0x06, 0x10, 0x26,
+ 0x00, 0x08, 0x20, 0xba, 0x58, 0x02, 0x10, 0x40, 0x74, 0xb1, 0x04, 0x20,
+ 0x80, 0xe8, 0x62, 0x09, 0x40, 0x00, 0xd1, 0xc5, 0x12, 0x80, 0x00, 0xa2,
+ 0x8b, 0x25, 0x00, 0x01, 0x44, 0x17, 0x4b, 0x00, 0x02, 0x88, 0x2e, 0x96,
+ 0x00, 0x04, 0x10, 0x5d, 0x2c, 0x01, 0x08, 0x20, 0xba, 0x58, 0x02, 0x10,
+ 0x40, 0x74, 0xb1, 0x04, 0x20, 0x80, 0xe8, 0x62, 0x09, 0x40, 0x80, 0x01,
+ 0x00, 0x64, 0x60, 0x82, 0xc9, 0xbd, 0x53, 0xb5, 0x4f, 0x00, 0x00, 0x00,
+ 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
};
-unsigned int doxygen_png_len = 1576;
+unsigned int doxygen_png_len = 1281;
unsigned char search_png[] = {
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
diff --git a/src/memberdef.cpp b/src/memberdef.cpp
index 5c0570b..a515a3d 100644
--- a/src/memberdef.cpp
+++ b/src/memberdef.cpp
@@ -543,7 +543,17 @@ QCString MemberDef::anchor() const
if (groupAlias) return groupAlias->anchor();
if (m_templateMaster) return m_templateMaster->anchor();
if (enumScope) result.prepend(enumScope->anchor());
- if (group) result.prepend("g");
+ if (group)
+ {
+ if (groupMember)
+ {
+ result=groupMember->anchor();
+ }
+ else
+ {
+ result.prepend("g");
+ }
+ }
return result;
}
@@ -1184,12 +1194,18 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
// name().data(),hasDocs,container->definitionType(),inGroup);
if ( !hasDocs ) return;
QCString scopeName = scName;
+ QCString memAnchor = anchor();
if (container->definitionType()==TypeGroup)
{
if (getClassDef()) scopeName=getClassDef()->name();
else if (getNamespaceDef()) scopeName=getNamespaceDef()->name();
else if (getFileDef()) scopeName=getFileDef()->name();
}
+ else if (container->definitionType()==TypeFile && getNamespaceDef())
+ { // member is in a namespace, but is written as part of the file documentation
+ // as well, so we need to make sure its label is unique.
+ memAnchor.prepend("file_");
+ }
QCString cname = container->name();
QCString cfname = getOutputFileBase();
@@ -1200,7 +1216,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
if (Config_getBool("GENERATE_HTML") && Config_getBool("GENERATE_HTMLHELP"))
{
HtmlHelp *htmlHelp = HtmlHelp::getInstance();
- htmlHelp->addIndexItem(cname,name(),cfname,anchor());
+ htmlHelp->addIndexItem(cname,name(),cfname,memAnchor);
}
// get member name
@@ -1242,11 +1258,11 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
{
if (vmd->isEnumerate() && ldef.mid(i,l)==vmd->name())
{
- ol.startDoxyAnchor(cfname,cname,anchor(),doxyName);
- ol.startMemberDoc(cname,name(),anchor(),name());
+ ol.startDoxyAnchor(cfname,cname,memAnchor,doxyName);
+ ol.startMemberDoc(cname,name(),memAnchor,name());
if (hasHtmlHelp)
{
- htmlHelp->addIndexItem(cname,name(),cfname,anchor());
+ htmlHelp->addIndexItem(cname,name(),cfname,memAnchor);
}
linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),name(),ldef.left(i));
vmd->writeEnumDeclaration(ol,getClassDef(),getNamespaceDef(),getFileDef(),getGroupDef());
@@ -1258,11 +1274,11 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
if (!found) // anonymous compound
{
//printf("Anonymous compound `%s'\n",cname.data());
- ol.startDoxyAnchor(cfname,cname,anchor(),doxyName);
- ol.startMemberDoc(cname,name(),anchor(),name());
+ ol.startDoxyAnchor(cfname,cname,memAnchor,doxyName);
+ ol.startMemberDoc(cname,name(),memAnchor,name());
if (hasHtmlHelp)
{
- htmlHelp->addIndexItem(cname,name(),cfname,anchor());
+ htmlHelp->addIndexItem(cname,name(),cfname,memAnchor);
}
// strip anonymous compound names from definition
int si=ldef.find(' '),pi,ei=i+l;
@@ -1280,11 +1296,11 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
}
else // not an enum value
{
- ol.startDoxyAnchor(cfname,cname,anchor(),doxyName);
- ol.startMemberDoc(cname,name(),anchor(),name());
+ ol.startDoxyAnchor(cfname,cname,memAnchor,doxyName);
+ ol.startMemberDoc(cname,name(),memAnchor,name());
if (hasHtmlHelp)
{
- htmlHelp->addIndexItem(cname,name(),cfname,anchor());
+ htmlHelp->addIndexItem(cname,name(),cfname,memAnchor);
}
ClassDef *cd=getClassDef();
@@ -1457,7 +1473,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
ol.endMemberDocName();
ol.endMemberDoc(FALSE);
}
- ol.endDoxyAnchor(cfname,anchor());
+ ol.endDoxyAnchor(cfname,memAnchor);
ol.startIndent();
ol.pushGeneratorState();
@@ -1872,7 +1888,9 @@ void MemberDef::setAnchor(const char *a)
anc=a;
}
-void MemberDef::setGroupDef(GroupDef *gd,Grouping::GroupPri_t pri,const QCString &fileName,int startLine,bool hasDocs)
+void MemberDef::setGroupDef(GroupDef *gd,Grouping::GroupPri_t pri,
+ const QCString &fileName,int startLine,
+ bool hasDocs,MemberDef *member)
{
//printf("%s MemberDef::setGroupDef(%s)\n",name().data(),gd->name().data());
group=gd;
@@ -1880,6 +1898,7 @@ void MemberDef::setGroupDef(GroupDef *gd,Grouping::GroupPri_t pri,const QCString
groupFileName=fileName;
groupStartLine=startLine;
groupHasDocs=hasDocs;
+ groupMember=member;
}
void MemberDef::setEnumScope(MemberDef *md)
diff --git a/src/memberdef.h b/src/memberdef.h
index 2fa4a85..b7dbf46 100644
--- a/src/memberdef.h
+++ b/src/memberdef.h
@@ -164,7 +164,9 @@ class MemberDef : public Definition
void setMaxInitLines(int lines) { userInitLines=lines; }
void setMemberClass(ClassDef *cd);
void setSectionList(Definition *d,MemberList *sl);
- void setGroupDef(GroupDef *gd,Grouping::GroupPri_t pri,const QCString &fileName,int startLine,bool hasDocs);
+ void setGroupDef(GroupDef *gd,Grouping::GroupPri_t pri,
+ const QCString &fileName,int startLine,bool hasDocs,
+ MemberDef *member=0);
void setExplicitExternal(bool b) { explExt=b; }
void setReadAccessor(const char *r) { read=r; }
void setWriteAccessor(const char *w) { write=w; }
@@ -360,6 +362,7 @@ class MemberDef : public Definition
QCString groupFileName; // file where this grouping was defined
int groupStartLine; // line " " " " "
bool groupHasDocs; // true if the entry that caused the grouping was documented
+ MemberDef *groupMember;
MemberDef *m_templateMaster;
SDict<MemberList> *classSectionSDict;
bool docsForDefinition; // TRUE => documentation block is put before
diff --git a/src/membergroup.cpp b/src/membergroup.cpp
index 1d1c749..e330d11 100644
--- a/src/membergroup.cpp
+++ b/src/membergroup.cpp
@@ -81,7 +81,9 @@ void MemberGroup::insertMember(MemberDef *md)
GroupDef *gd;
if (firstMd && (gd=firstMd->getGroupDef()))
{
- md->setGroupDef(gd, firstMd->getGroupPri(), firstMd->getGroupFileName(), firstMd->getGroupStartLine(), firstMd->getGroupHasDocs());
+ md->setGroupDef(gd, firstMd->getGroupPri(),
+ firstMd->getGroupFileName(), firstMd->getGroupStartLine(),
+ firstMd->getGroupHasDocs());
gd->insertMember(md);
}
}
diff --git a/src/scanner.l b/src/scanner.l
index d9d7da9..1a4c42d 100644
--- a/src/scanner.l
+++ b/src/scanner.l
@@ -2636,7 +2636,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
<ReadBody,ReadNSBody,ReadBodyIntf>{BN}+ { current->program += yytext ;
lineCount() ;
}
-<ReadBodyIntf>"@end" { // end of Objective C block
+<ReadBodyIntf>"@end"/[^a-z_A-Z0-9] { // end of Objective C block
current_root->addSubEntry( current ) ;
current=new Entry;
initEntry();
@@ -5475,7 +5475,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
unput('\n');
BEGIN( lastInternalDocContext );
}
-<AfterDoc>{CMD}"brief" { BEGIN(AfterDocBrief); }
+<AfterDoc>{CMD}"brief" { current->brief.resize(0); BEGIN(AfterDocBrief); }
<AfterDoc>"/*"|"//" { current->doc+=yytext; }
<AfterDoc>^{B}*"*"+/[^/]
<AfterDoc>\n { current->doc+=yytext; yyLineNr++; }
diff --git a/src/util.cpp b/src/util.cpp
index c204a18..1d592d4 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -1203,6 +1203,7 @@ static bool findOperator(const QCString &s,int i)
}
static const char constScope[] = { 'c', 'o', 'n', 's', 't', ':' };
+static const char virtualScope[] = { 'v', 'i', 'r', 't', 'u', 'a', 'l', ':' };
QCString removeRedundantWhiteSpace(const QCString &s)
{
@@ -1211,11 +1212,13 @@ QCString removeRedundantWhiteSpace(const QCString &s)
uint i;
uint l=s.length();
uint csp=0;
+ uint vsp=0;
for (i=0;i<l;i++)
{
nextChar:
char c=s.at(i);
if (csp<6 && c==constScope[csp]) csp++; else csp=0;
+ if (vsp<8 && c==virtualScope[vsp]) vsp++; else vsp=0;
if (c=='"') // quoted string
{
i++;
@@ -1262,9 +1265,13 @@ nextChar:
result+=' ';
result+=s.at(i);
}
- else if (c=='t' && csp==5 && !(isId(s.at(i+1)) || s.at(i+1)==' ' || s.at(i+1)==')' || s.at(i+1)==',' || s.at(i+1)=='\0')) // prevent const ::A from being converted to const::A
+ else if (c=='t' && csp==5 &&
+ !(isId(s.at(i+1)) /*|| s.at(i+1)==' '*/ || s.at(i+1)==')' ||
+ s.at(i+1)==',' || s.at(i+1)=='\0'))
+ // prevent const ::A from being converted to const::A
{
result+="t ";
+ if (s.at(i+1)==' ') i++;
csp=0;
}
else if (c==':' && csp==6) // replace const::A by const ::A
@@ -1272,6 +1279,20 @@ nextChar:
result+=" :";
csp=0;
}
+ else if (c=='l' && vsp==7 &&
+ !(isId(s.at(i+1)) /*|| s.at(i+1)==' '*/ || s.at(i+1)==')' ||
+ s.at(i+1)==',' || s.at(i+1)=='\0'))
+ // prevent virtual ::A from being converted to virtual::A
+ {
+ result+="l ";
+ if (s.at(i+1)==' ') i++;
+ vsp=0;
+ }
+ else if (c==':' && vsp==8) // replace virtual::A by virtual ::A
+ {
+ result+=" :";
+ vsp=0;
+ }
else if (!isspace((uchar)c) ||
( i>0 && i<l-1 &&
(isId(s.at(i-1)) || s.at(i-1)==')' || s.at(i-1)==',' || s.at(i-1)=='>' || s.at(i-1)==']')
@@ -1399,6 +1420,16 @@ void linkifyText(const TextGeneratorIntf &out,Definition *scope,
found=TRUE;
}
}
+ else if ((cd=getClass(word+"-p"))) // search for Obj-C protocols as well
+ {
+ // add link to the result
+ if (external ? cd->isLinkable() : cd->isLinkableInProject())
+ {
+ out.writeLink(cd->getReference(),cd->getOutputFileBase(),0,word);
+ found=TRUE;
+ }
+ }
+
if (scope &&
(scope->definitionType()==Definition::TypeClass ||
@@ -3335,7 +3366,12 @@ bool resolveLink(/* in */ const char *scName,
*resContext=fd;
return TRUE;
}
- else if ((cd=getClass(linkRef)))
+ else if ((cd=getClass(linkRef))) // class link
+ {
+ *resContext=cd;
+ return TRUE;
+ }
+ else if ((cd=getClass(linkRef+"-p"))) // Obj-C protocol link
{
*resContext=cd;
return TRUE;