From 3aaaf142be657201a2664c10b96447acb1610187 Mon Sep 17 00:00:00 2001 From: Dimitri van Heesch Date: Tue, 24 Aug 2004 20:00:14 +0000 Subject: Release-1.3.8-20040824 --- INSTALL | 4 +- README | 4 +- VERSION | 2 +- addon/doxywizard/doxywizard.cpp | 9 ++ addon/doxywizard/doxywizard.h | 2 +- configure | 48 ++++---- doc/commands.doc | 5 +- packages/rpm/doxygen.spec | 2 +- src/code.l | 5 + src/definition.h | 2 +- src/dirdef.cpp | 134 +++++++++++++++++++++++ src/dirdef.h | 61 +++++++++++ src/docparser.cpp | 25 ++++- src/docparser.h | 8 +- src/dot.cpp | 26 ++++- src/dot.h | 2 + src/doxygen.cpp | 16 ++- src/doxygen.h | 2 + src/filedef.cpp | 7 +- src/filedef.h | 21 ++-- src/groupdef.cpp | 3 +- src/groupdef.h | 3 +- src/htmldocvisitor.cpp | 15 ++- src/htmlgen.cpp | 35 +++--- src/htmlgen.h | 4 +- src/index.cpp | 69 ++++++++---- src/libdoxygen.pro.in | 2 + src/logos.cpp | 237 ++++++++++++++++++---------------------- src/memberdef.cpp | 45 +++++--- src/memberdef.h | 5 +- src/membergroup.cpp | 4 +- src/scanner.l | 4 +- src/util.cpp | 40 ++++++- tmake/lib/aix-xlc/tmake.conf | 6 +- 34 files changed, 606 insertions(+), 251 deletions(-) create mode 100644 src/dirdef.cpp create mode 100644 src/dirdef.h diff --git a/INSTALL b/INSTALL index cc051af..d631c9a 100644 --- a/INSTALL +++ b/INSTALL @@ -1,7 +1,7 @@ -DOXYGEN Version 1.3.8-20040812 +DOXYGEN Version 1.3.8-20040824 Please read the installation section of the manual (http://www.doxygen.org/install.html) for instructions. -------- -Dimitri van Heesch (12 August 2004) +Dimitri van Heesch (24 August 2004) diff --git a/README b/README index 4875825..916ed03 100644 --- a/README +++ b/README @@ -1,4 +1,4 @@ -DOXYGEN Version 1.3.8_20040812 +DOXYGEN Version 1.3.8_20040824 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) (12 August 2004) +Dimitri van Heesch (dimitri@stack.nl) (24 August 2004) diff --git a/VERSION b/VERSION index e2c7de3..b894654 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.3.8-20040812 +1.3.8-20040824 diff --git a/addon/doxywizard/doxywizard.cpp b/addon/doxywizard/doxywizard.cpp index 7060242..5680455 100644 --- a/addon/doxywizard/doxywizard.cpp +++ b/addon/doxywizard/doxywizard.cpp @@ -1370,6 +1370,15 @@ int main(int argc,char **argv) { QApplication a(argc,argv); MainWidget main; + if (argc==2 && argv[1][0]!='-') // name of config file as an argument + { + main.loadConfigFromFile(argv[1]); + } + else if (argc>1) + { + printf("Usage: %s [config file]\n",argv[0]); + exit(1); + } a.setMainWidget(&main); main.show(); return a.exec(); diff --git a/addon/doxywizard/doxywizard.h b/addon/doxywizard/doxywizard.h index 6964cfe..c937dae 100644 --- a/addon/doxywizard/doxywizard.h +++ b/addon/doxywizard/doxywizard.h @@ -242,6 +242,7 @@ class MainWidget : public QMainWindow public: MainWidget(QWidget *parent=0); ~MainWidget(); + void loadConfigFromFile(const QString &); private slots: void launchWizard(); @@ -263,7 +264,6 @@ class MainWidget : public QMainWindow private: void setConfigSaved(bool); - void loadConfigFromFile(const QString &); void addRecentFile(const QString &); QPushButton *m_wizard; diff --git a/configure b/configure index b1f02ee..3985b91 100755 --- a/configure +++ b/configure @@ -234,27 +234,35 @@ if test "$f_wizard" = YES; then if test -z "$QTDIR"; then echo " QTDIR environment variable not set!" echo -n " Checking for Qt..." - if test -d "/usr/lib/qt3/lib"; then - if test -d "/usr/lib/qt3/include"; then - if test -x "/usr/lib/qt3/bin/moc"; then - QTDIR="/usr/lib/qt3" - fi - fi - fi - if test -d "/usr/lib/qt2/lib"; then - if test -d "/usr/lib/qt2/include"; then - if test -x "/usr/lib/qt2/bin/moc"; then - QTDIR="/usr/lib/qt2" - fi - fi - fi - if test -d "/usr/lib/qt/lib"; then - if test -d "/usr/lib/qt/include"; then - if test -x "/usr/lib/qt/bin/moc"; then - QTDIR="/usr/lib/qt" - fi + for d in /usr/lib/{qt-3.1,qt3,qt2,qt,qt*}; do + if test -d "$d/lib" -a -d "$d/include" -a -x "$d/bin/moc"; then + QTDIR=$d fi - fi + done +# if test -d "/usr/lib/qt3/lib"; then +# if test -d "/usr/lib/qt3/include"; then +# if test -x "/usr/lib/qt3/bin/moc"; then +# QTDIR="/usr/lib/qt3" +# fi +# fi +# fi +# if test -d "/usr/lib/qt2/lib"; then +# if test -d "/usr/lib/qt2/include"; then +# if test -x "/usr/lib/qt2/bin/moc"; then +# QTDIR="/usr/lib/qt2" +# fi +# fi +# fi +# if test -d "/usr/lib/qt/lib"; then +# if test -d "/usr/lib/qt/include"; then +# if test -x "/usr/lib/qt/bin/moc"; then +# QTDIR="/usr/lib/qt" +# fi +# fi +# fi + else + echo " Detected Qt via the QTDIR environment variable..." + echo -n " " fi if test -z "$QTDIR"; then echo "QTDIR not set and Qt not found at standard locations!" diff --git a/doc/commands.doc b/doc/commands.doc index 4ca0aa6..e6d4ad3 100644 --- a/doc/commands.doc +++ b/doc/commands.doc @@ -20,7 +20,7 @@ All commands in the documentation start with a backslash (\\) or an at-sign (\@). If you prefer you can replace all commands starting with a -backslash below, by their counterparts that start with an at-sign. +backslash below by their counterparts that start with an at-sign. Some commands have one or more arguments. Each argument has a certain range: @@ -350,6 +350,9 @@ doxygen. Unrecognized commands are treated as normal text. for the corresponding HTML documentation that is generated by doxygen. \endhtmlonly + \note In the above example \ref cfg_javadoc_autobrief "JAVADOC_AUTOBRIEF" + has been set to YES in the configuration file. +
\section cmdfn \fn (function declaration) diff --git a/packages/rpm/doxygen.spec b/packages/rpm/doxygen.spec index 7ab9201..ba01fa0 100644 --- a/packages/rpm/doxygen.spec +++ b/packages/rpm/doxygen.spec @@ -1,6 +1,6 @@ Summary: A documentation system for C/C++. Name: doxygen -Version: 1.3.8_20040812 +Version: 1.3.8_20040824 Release: 1 Epoch: 1 Source0: ftp://ftp.stack.nl/pub/users/dimitri/%{name}-%{version}.src.tar.gz 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; } +{SCOPENAME}/{B}*[;,)\]] { // "int var;" or "var, var2" or "debug(f) macro" + generateClassOrGlobalLink(*g_code,yytext,TRUE); + addType(); + g_name+=yytext; + } {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::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 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 &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 &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, public DocNode class DocAutoList : public CompAccept, 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::accept(this,v); } int parse(); @@ -520,6 +523,7 @@ class DocAutoList : public CompAccept, 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 << "" << endl; + out << "
" << endl; QListIterator 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 *Doxygen::symbolMap; bool Doxygen::outputToWizard=FALSE; QDict * Doxygen::htmlDirMap = 0; QCache Doxygen::lookupCache(20000,20000); +SDict 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 StringList; typedef QDict FileDict; @@ -112,6 +113,7 @@ class Doxygen static bool outputToWizard; static QDict *htmlDirMap; static QCache lookupCache; + static SDict 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("", 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 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 *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 &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 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 << "
    "; + // + // Do list type based on depth: + // 1. + // a. + // i. + // A. + // 1. (repeat)... + // + m_t << "
      "; } 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 << "
      \n"; t << theTranslator->trGeneratedAt( "$datetime", "$projectname" ); - t << " " + t << " " << "\"doxygen\"" + << "align=\"middle\" border=\"0\">" << " $doxygenversion"; t << "
      \n" << "\n" @@ -446,9 +441,9 @@ static void writePageFooter(QTextStream &t,const QCString &lastTitle, dateToString(TRUE), Config_getString("PROJECT_NAME") ); - t << endl << ""; + t << " " << endl << ""; t << endl << "\"doxygen\"" << " " << versionString << " "; + << "align=\"middle\" border=\"0\">" << " " << versionString << " "; t << ""; 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 << ""; + t << ""; } void HtmlGenerator::endDoxyAnchor(const char *,const char *) @@ -859,9 +854,9 @@ void HtmlGenerator::startMemberItem(int annoType) t << "
"; switch(annoType) { - case 0: t << "
"; break; + case 0: t << ""; break; case 1: t << ""; break; - default: t << ""; break; + default: t << ""; break; } } else @@ -886,7 +881,7 @@ void HtmlGenerator::insertMemberAlign() DBG_HTML(t << "" << endl) if (Config_getBool("HTML_ALIGN_MEMBERS")) { - t << " "; + t << " "; } } @@ -921,7 +916,7 @@ void HtmlGenerator::startMemberSections() DBG_HTML(t << "" << endl) if (Config_getBool("HTML_ALIGN_MEMBERS")) { - t << "" << endl; + t << "
" << endl; // HTML is not recursively decomposable, sorry t << "" << endl; } @@ -941,7 +936,7 @@ void HtmlGenerator::startMemberHeader() DBG_HTML(t << "" << endl) if (Config_getBool("HTML_ALIGN_MEMBERS")) { - t << "" << endl; t << "

"; + t << "


"; } else { @@ -965,7 +960,7 @@ void HtmlGenerator::endMemberHeader() void HtmlGenerator::startMemberSubtitle() { DBG_HTML(t << "" << endl) - if (Config_getBool("HTML_ALIGN_MEMBERS")) t << "

"; + if (Config_getBool("HTML_ALIGN_MEMBERS")) t << "
"; } void HtmlGenerator::endMemberSubtitle() @@ -1036,7 +1031,7 @@ void HtmlGenerator::startMemberDocName(bool align) t << "
"; + t << ">"; } void HtmlGenerator::endMemberDocName() @@ -1213,7 +1208,7 @@ void HtmlGenerator::startIndent() //t << "
" << endl; - t << "\n" + t << "
\n" " \n" " "; } 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 += "

\n"; ol.writeString(alphaLinks); - ol.writeString("

\n" "  \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 << "" << endl; } + { t << "
" << endl; } void endDescTable() { t << "
" << endl; } void startDescTableTitle() - { t << "
"; } + { t << "
"; } void endDescTableTitle() { t << " 
\n"); + ol.writeString("
\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 *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_;] {BN}+ { current->program += yytext ; lineCount() ; } -"@end" { // end of Objective C block +"@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 ); } -{CMD}"brief" { BEGIN(AfterDocBrief); } +{CMD}"brief" { current->brief.resize(0); BEGIN(AfterDocBrief); } "/*"|"//" { current->doc+=yytext; } ^{B}*"*"+/[^/] \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;i0 && i' || 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; diff --git a/tmake/lib/aix-xlc/tmake.conf b/tmake/lib/aix-xlc/tmake.conf index ef65b37..04d5f15 100755 --- a/tmake/lib/aix-xlc/tmake.conf +++ b/tmake/lib/aix-xlc/tmake.conf @@ -7,11 +7,13 @@ TEMPLATE = app CONFIG = qt warn_on release -TMAKE_CC = xlC +TMAKE_CC = xlc +#TMAKE_CC = xlC TMAKE_CFLAGS = -+ -qstrict -D_BSD TMAKE_CFLAGS_WARN_ON = TMAKE_CFLAGS_WARN_OFF = -TMAKE_CFLAGS_RELEASE = -O3 +TMAKE_CFLAGS_RELEASE = -O +#TMAKE_CFLAGS_RELEASE = -O3 TMAKE_CFLAGS_DEBUG = -g TMAKE_CFLAGS_SHLIB = TMAKE_CFLAGS_YACC = -- cgit v0.12