summaryrefslogtreecommitdiffstats
path: root/src/tagreader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/tagreader.cpp')
-rw-r--r--src/tagreader.cpp1399
1 files changed, 0 insertions, 1399 deletions
diff --git a/src/tagreader.cpp b/src/tagreader.cpp
deleted file mode 100644
index 9fd90d4..0000000
--- a/src/tagreader.cpp
+++ /dev/null
@@ -1,1399 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 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.
- *
- */
-
-#include "tagreader.h"
-
-#include <stdio.h>
-#include <stdarg.h>
-
-#include <qxml.h>
-#include <qstack.h>
-#include <qdict.h>
-#include <qfileinfo.h>
-#include <qlist.h>
-#include <qstring.h>
-#include <qstringlist.h>
-
-#include "entry.h"
-#include "classdef.h"
-#include "doxygen.h"
-#include "util.h"
-#include "message.h"
-#include "defargs.h"
-//#include "reflist.h"
-
-/*! Information about an linkable anchor */
-class TagAnchorInfo
-{
- public:
- TagAnchorInfo(const QString &f,const QString &l) : label(l), fileName(f) {}
- QString label;
- QString fileName;
-};
-
-class TagAnchorInfoList : public QList<TagAnchorInfo>
-{
- public:
- TagAnchorInfoList() : QList<TagAnchorInfo>() { setAutoDelete(TRUE); }
- virtual ~TagAnchorInfoList() {}
-};
-
-/*! Container for member specific info that can be read from a tagfile */
-class TagMemberInfo
-{
- public:
- TagMemberInfo() : prot(Public), virt(Normal), isStatic(FALSE) {}
- QString type;
- QString name;
- QString anchorFile;
- QString anchor;
- QString arglist;
- QString kind;
- TagAnchorInfoList docAnchors;
- Protection prot;
- Specifier virt;
- bool isStatic;
-};
-
-/*! Container for class specific info that can be read from a tagfile */
-class TagClassInfo
-{
- public:
- enum Kind { Class, Struct, Union, Interface, Exception, Protocol, Category };
- TagClassInfo() { bases=0, templateArguments=0; members.setAutoDelete(TRUE); isObjC=FALSE; }
- ~TagClassInfo() { delete bases; delete templateArguments; }
- QString name;
- QString filename;
- TagAnchorInfoList docAnchors;
- QList<BaseInfo> *bases;
- QList<TagMemberInfo> members;
- QList<QString> *templateArguments;
- QStringList classList;
- Kind kind;
- bool isObjC;
-};
-
-/*! Container for namespace specific info that can be read from a tagfile */
-class TagNamespaceInfo
-{
- public:
- TagNamespaceInfo() { members.setAutoDelete(TRUE); }
- QString name;
- QString filename;
- QStringList classList;
- QStringList namespaceList;
- TagAnchorInfoList docAnchors;
- QList<TagMemberInfo> members;
-};
-
-/*! Container for package specific info that can be read from a tagfile */
-class TagPackageInfo
-{
- public:
- TagPackageInfo() { members.setAutoDelete(TRUE); }
- QString name;
- QString filename;
- TagAnchorInfoList docAnchors;
- QList<TagMemberInfo> members;
- QStringList classList;
-};
-
-class TagIncludeInfo
-{
- public:
- QString id;
- QString name;
- QString text;
- bool isLocal;
- bool isImported;
-};
-
-/*! Container for file specific info that can be read from a tagfile */
-class TagFileInfo
-{
- public:
- TagFileInfo() { members.setAutoDelete(TRUE); includes.setAutoDelete(TRUE); }
- QString name;
- QString path;
- QString filename;
- TagAnchorInfoList docAnchors;
- QList<TagMemberInfo> members;
- QStringList classList;
- QStringList namespaceList;
- QList<TagIncludeInfo> includes;
-};
-
-/*! Container for group specific info that can be read from a tagfile */
-class TagGroupInfo
-{
- public:
- TagGroupInfo() { members.setAutoDelete(TRUE); }
- QString name;
- QString title;
- QString filename;
- TagAnchorInfoList docAnchors;
- QList<TagMemberInfo> members;
- QStringList subgroupList;
- QStringList classList;
- QStringList namespaceList;
- QStringList fileList;
- QStringList pageList;
- QStringList dirList;
-};
-
-/*! Container for page specific info that can be read from a tagfile */
-class TagPageInfo
-{
- public:
- QString name;
- QString title;
- QString filename;
- TagAnchorInfoList docAnchors;
-};
-
-/*! Container for directory specific info that can be read from a tagfile */
-class TagDirInfo
-{
- public:
- QString name;
- QString filename;
- QString path;
- QStringList subdirList;
- QStringList fileList;
- TagAnchorInfoList docAnchors;
-};
-
-/*! Tag file parser.
- * Reads an XML-structured tagfile and builds up the structure in
- * memory. The method buildLists() is used to transfer/translate
- * the structures to the doxygen engine.
- */
-class TagFileParser : public QXmlDefaultHandler
-{
- enum State { Invalid,
- InClass,
- InFile,
- InNamespace,
- InGroup,
- InPage,
- InMember,
- InPackage,
- InDir,
- InTempArgList
- };
- class StartElementHandler
- {
- typedef void (TagFileParser::*Handler)(const QXmlAttributes &attrib);
- public:
- StartElementHandler(TagFileParser *parent, Handler h) : m_parent(parent), m_handler(h) {}
- void operator()(const QXmlAttributes &attrib) { (m_parent->*m_handler)(attrib); }
- private:
- TagFileParser *m_parent;
- Handler m_handler;
- };
-
- class EndElementHandler
- {
- typedef void (TagFileParser::*Handler)();
- public:
- EndElementHandler(TagFileParser *parent, Handler h) : m_parent(parent), m_handler(h) {}
- void operator()() { (m_parent->*m_handler)(); }
- private:
- TagFileParser *m_parent;
- Handler m_handler;
- };
-
- public:
- TagFileParser(const char *tagName) : m_startElementHandlers(17),
- m_endElementHandlers(17),
- m_tagName(tagName)
- {
- m_startElementHandlers.setAutoDelete(TRUE);
- m_endElementHandlers.setAutoDelete(TRUE);
- }
-
- void setDocumentLocator ( QXmlLocator * locator )
- {
- m_locator = locator;
- }
-
- void setFileName( const QString &fileName )
- {
- m_inputFileName = fileName;
- }
-
- void warn(const char *fmt,...)
- {
- va_list args;
- va_start(args, fmt);
- ::warn(m_inputFileName,m_locator->lineNumber(),fmt,args);
- va_end(args);
- }
-
- void startCompound( const QXmlAttributes& attrib )
- {
- m_curString = "";
- QString kind = attrib.value("kind");
- QString isObjC = attrib.value("objc");
- if (kind=="class")
- {
- m_curClass = new TagClassInfo;
- m_curClass->kind = TagClassInfo::Class;
- m_state = InClass;
- }
- else if (kind=="struct")
- {
- m_curClass = new TagClassInfo;
- m_curClass->kind = TagClassInfo::Struct;
- m_state = InClass;
- }
- else if (kind=="union")
- {
- m_curClass = new TagClassInfo;
- m_curClass->kind = TagClassInfo::Union;
- m_state = InClass;
- }
- else if (kind=="interface")
- {
- m_curClass = new TagClassInfo;
- m_curClass->kind = TagClassInfo::Interface;
- m_state = InClass;
- }
- else if (kind=="exception")
- {
- m_curClass = new TagClassInfo;
- m_curClass->kind = TagClassInfo::Exception;
- m_state = InClass;
- }
- else if (kind=="protocol")
- {
- m_curClass = new TagClassInfo;
- m_curClass->kind = TagClassInfo::Protocol;
- m_state = InClass;
- }
- else if (kind=="category")
- {
- m_curClass = new TagClassInfo;
- m_curClass->kind = TagClassInfo::Category;
- m_state = InClass;
- }
- else if (kind=="file")
- {
- m_curFile = new TagFileInfo;
- m_state = InFile;
- }
- else if (kind=="namespace")
- {
- m_curNamespace = new TagNamespaceInfo;
- m_state = InNamespace;
- }
- else if (kind=="group")
- {
- m_curGroup = new TagGroupInfo;
- m_state = InGroup;
- }
- else if (kind=="page")
- {
- m_curPage = new TagPageInfo;
- m_state = InPage;
- }
- else if (kind=="package")
- {
- m_curPackage = new TagPackageInfo;
- m_state = InPackage;
- }
- else if (kind=="dir")
- {
- m_curDir = new TagDirInfo;
- m_state = InDir;
- }
- else
- {
- warn("Warning: Unknown compound attribute `%s' found!\n",kind.data());
- }
- if (isObjC=="yes" && m_curClass)
- {
- m_curClass->isObjC = TRUE;
- }
- }
-
- void endCompound()
- {
- switch (m_state)
- {
- case InClass: m_tagFileClasses.append(m_curClass);
- m_curClass=0; break;
- case InFile: m_tagFileFiles.append(m_curFile);
- m_curFile=0; break;
- case InNamespace: m_tagFileNamespaces.append(m_curNamespace);
- m_curNamespace=0; break;
- case InGroup: m_tagFileGroups.append(m_curGroup);
- m_curGroup=0; break;
- case InPage: m_tagFilePages.append(m_curPage);
- m_curPage=0; break;
- case InDir: m_tagFileDirs.append(m_curDir);
- m_curDir=0; break;
- case InPackage: m_tagFilePackages.append(m_curPackage);
- m_curPackage=0; break;
- default:
- warn("Warning: tag `compound' was not expected!\n");
- }
- }
-
- void startMember( const QXmlAttributes& attrib)
- {
- m_curMember = new TagMemberInfo;
- m_curMember->kind = attrib.value("kind");
- QString protStr = attrib.value("protection");
- QString virtStr = attrib.value("virtualness");
- QString staticStr = attrib.value("static");
- if (protStr=="protected")
- {
- m_curMember->prot = Protected;
- }
- else if (protStr=="private")
- {
- m_curMember->prot = Private;
- }
- if (virtStr=="virtual")
- {
- m_curMember->virt = Virtual;
- }
- else if (virtStr=="pure")
- {
- m_curMember->virt = Pure;
- }
- if (staticStr=="yes")
- {
- m_curMember->isStatic = TRUE;
- }
- m_stateStack.push(new State(m_state));
- m_state = InMember;
- }
-
- void endMember()
- {
- m_state = *m_stateStack.top();
- m_stateStack.remove();
- switch(m_state)
- {
- case InClass: m_curClass->members.append(m_curMember); break;
- case InFile: m_curFile->members.append(m_curMember); break;
- case InNamespace: m_curNamespace->members.append(m_curMember); break;
- case InGroup: m_curGroup->members.append(m_curMember); break;
- case InPackage: m_curPackage->members.append(m_curMember); break;
- default: warn("Warning: Unexpected tag `member' found\n"); break;
- }
- }
-
- void endDocAnchor()
- {
- switch(m_state)
- {
- case InClass: m_curClass->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString)); break;
- case InFile: m_curFile->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString)); break;
- case InNamespace: m_curNamespace->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString)); break;
- case InGroup: m_curGroup->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString)); break;
- case InPage: m_curPage->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString)); break;
- case InMember: m_curMember->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString)); break;
- case InPackage: m_curPackage->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString)); break;
- case InDir: m_curDir->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString)); break;
- default: warn("Warning: Unexpected tag `member' found\n"); break;
- }
- }
-
- void endClass()
- {
- switch(m_state)
- {
- case InClass: m_curClass->classList.append(m_curString); break;
- case InFile: m_curFile->classList.append(m_curString); break;
- case InNamespace: m_curNamespace->classList.append(m_curString); break;
- case InGroup: m_curGroup->classList.append(m_curString); break;
- case InPackage: m_curPackage->classList.append(m_curString); break;
- default: warn("Warning: Unexpected tag `class' found\n"); break;
- }
- }
-
- void endNamespace()
- {
- switch(m_state)
- {
- case InNamespace: m_curNamespace->classList.append(m_curString); break;
- case InFile: m_curFile->namespaceList.append(m_curString); break;
- case InGroup: m_curGroup->namespaceList.append(m_curString); break;
- default: warn("Warning: Unexpected tag `namespace' found\n"); break;
- }
- }
-
- void endFile()
- {
- switch(m_state)
- {
- case InGroup: m_curGroup->fileList.append(m_curString); break;
- case InDir: m_curDir->fileList.append(m_curString); break;
- default: warn("Warning: Unexpected tag `file' found\n"); break;
- }
- }
-
- void endPage()
- {
- switch(m_state)
- {
- case InGroup: m_curGroup->fileList.append(m_curString); break;
- default: warn("Warning: Unexpected tag `page' found\n"); break;
- }
- }
-
- void endDir()
- {
- switch(m_state)
- {
- case InDir: m_curDir->subdirList.append(m_curString); break;
- default: warn("Warning: Unexpected tag `page' found\n"); break;
- }
- }
-
- void startStringValue(const QXmlAttributes& )
- {
- m_curString = "";
- }
-
- void startDocAnchor(const QXmlAttributes& attrib )
- {
- m_fileName = attrib.value("file");
- m_curString = "";
- }
-
- void endType()
- {
- if (m_state==InMember)
- {
- m_curMember->type = m_curString;
- }
- else
- {
- warn("Warning: Unexpected tag `type' found\n");
- }
- }
-
- void endName()
- {
- switch (m_state)
- {
- case InClass: m_curClass->name = m_curString; break;
- case InFile: m_curFile->name = m_curString; break;
- case InNamespace: m_curNamespace->name = m_curString; break;
- case InGroup: m_curGroup->name = m_curString; break;
- case InPage: m_curPage->name = m_curString; break;
- case InDir: m_curDir->name = m_curString; break;
- case InMember: m_curMember->name = m_curString; break;
- case InPackage: m_curPackage->name = m_curString; break;
- default: warn("Warning: Unexpected tag `name' found\n"); break;
- }
- }
-
- void startBase(const QXmlAttributes& attrib )
- {
- m_curString="";
- if (m_state==InClass && m_curClass)
- {
- QString protStr = attrib.value("protection");
- QString virtStr = attrib.value("virtualness");
- Protection prot = Public;
- Specifier virt = Normal;
- if (protStr=="protected")
- {
- prot = Protected;
- }
- else if (protStr=="private")
- {
- prot = Private;
- }
- if (virtStr=="virtual")
- {
- virt = Virtual;
- }
- if (m_curClass->bases==0)
- {
- m_curClass->bases = new QList<BaseInfo>;
- m_curClass->bases->setAutoDelete(TRUE);
- }
- m_curClass->bases->append(new BaseInfo(m_curString,prot,virt));
- }
- else
- {
- warn("Warning: Unexpected tag `base' found\n");
- }
- }
-
- void endBase()
- {
- if (m_state==InClass && m_curClass)
- {
- m_curClass->bases->getLast()->name = m_curString;
- }
- else
- {
- warn("Warning: Unexpected tag `base' found\n");
- }
- }
-
- void startIncludes(const QXmlAttributes& attrib )
- {
- if (m_state==InFile && m_curFile)
- {
- m_curIncludes = new TagIncludeInfo;
- m_curIncludes->id = attrib.value("id");
- m_curIncludes->name = attrib.value("name");
- m_curIncludes->isLocal = attrib.value("local")=="yes" ? TRUE : FALSE;
- m_curIncludes->isImported = attrib.value("imported")=="yes" ? TRUE : FALSE;
- m_curFile->includes.append(m_curIncludes);
- }
- else
- {
- warn("Warning: Unexpected tag `includes' found\n");
- }
- m_curString="";
- }
-
- void endIncludes()
- {
- m_curIncludes->text = m_curString;
- }
-
- void endTemplateArg()
- {
- if (m_state==InClass && m_curClass)
- {
- if (m_curClass->templateArguments==0)
- {
- m_curClass->templateArguments = new QList<QString>;
- m_curClass->templateArguments->setAutoDelete(TRUE);
- }
- m_curClass->templateArguments->append(new QString(m_curString));
- }
- else
- {
- warn("Warning: Unexpected tag `templarg' found\n");
- }
- }
-
- void endFilename()
- {
- switch (m_state)
- {
- case InClass: m_curClass->filename = m_curString; break;
- case InNamespace: m_curNamespace->filename = m_curString; break;
- case InFile: m_curFile->filename = m_curString; break;
- case InGroup: m_curGroup->filename = m_curString; break;
- case InPage: m_curPage->filename = m_curString; break;
- case InPackage: m_curPackage->filename = m_curString; break;
- case InDir: m_curDir->filename = m_curString; break;
- default: warn("Warning: Unexpected tag `filename' found\n"); break;
- }
- }
-
- void endPath()
- {
- switch (m_state)
- {
- case InFile: m_curFile->path = m_curString; break;
- case InDir: m_curDir->path = m_curString; break;
- default: warn("Warning: Unexpected tag `path' found\n"); break;
- }
- }
-
- void endAnchor()
- {
- if (m_state==InMember)
- {
- m_curMember->anchor = m_curString;
- }
- else
- {
- warn("Warning: Unexpected tag `anchor' found\n");
- }
- }
-
- void endAnchorFile()
- {
- if (m_state==InMember)
- {
- m_curMember->anchorFile = m_curString;
- }
- else
- {
- warn("Warning: Unexpected tag `anchorfile' found\n");
- }
- }
-
- void endArglist()
- {
- if (m_state==InMember)
- {
- m_curMember->arglist = m_curString;
- }
- else
- {
- warn("Warning: Unexpected tag `arglist' found\n");
- }
- }
- void endTitle()
- {
- switch (m_state)
- {
- case InGroup: m_curGroup->title = m_curString; break;
- case InPage: m_curPage->title = m_curString; break;
- default: warn("Warning: Unexpected tag `title' found\n"); break;
- }
- }
-
- void endSubgroup()
- {
- if (m_state==InGroup)
- {
- m_curGroup->subgroupList.append(m_curString);
- }
- else
- {
- warn("Warning: Unexpected tag `subgroup' found\n");
- }
- }
-
- void startIgnoreElement(const QXmlAttributes& )
- {
- }
-
- void endIgnoreElement()
- {
- }
-
- bool startDocument()
- {
- m_state = Invalid;
-
- m_curClass=0;
- m_curNamespace=0;
- m_curFile=0;
- m_curGroup=0;
- m_curPage=0;
- m_curPackage=0;
- m_curDir=0;
-
- m_stateStack.setAutoDelete(TRUE);
- m_tagFileClasses.setAutoDelete(TRUE);
- m_tagFileFiles.setAutoDelete(TRUE);
- m_tagFileNamespaces.setAutoDelete(TRUE);
- m_tagFileGroups.setAutoDelete(TRUE);
- m_tagFilePages.setAutoDelete(TRUE);
- m_tagFilePackages.setAutoDelete(TRUE);
- m_tagFileDirs.setAutoDelete(TRUE);
-
- m_startElementHandlers.insert("compound", new StartElementHandler(this,&TagFileParser::startCompound));
- m_startElementHandlers.insert("member", new StartElementHandler(this,&TagFileParser::startMember));
- m_startElementHandlers.insert("name", new StartElementHandler(this,&TagFileParser::startStringValue));
- m_startElementHandlers.insert("base", new StartElementHandler(this,&TagFileParser::startBase));
- m_startElementHandlers.insert("filename", new StartElementHandler(this,&TagFileParser::startStringValue));
- m_startElementHandlers.insert("includes", new StartElementHandler(this,&TagFileParser::startIncludes));
- m_startElementHandlers.insert("path", new StartElementHandler(this,&TagFileParser::startStringValue));
- m_startElementHandlers.insert("anchorfile", new StartElementHandler(this,&TagFileParser::startStringValue));
- m_startElementHandlers.insert("anchor", new StartElementHandler(this,&TagFileParser::startStringValue));
- m_startElementHandlers.insert("arglist", new StartElementHandler(this,&TagFileParser::startStringValue));
- m_startElementHandlers.insert("title", new StartElementHandler(this,&TagFileParser::startStringValue));
- m_startElementHandlers.insert("subgroup", new StartElementHandler(this,&TagFileParser::startStringValue));
- m_startElementHandlers.insert("class", new StartElementHandler(this,&TagFileParser::startStringValue));
- m_startElementHandlers.insert("namespace", new StartElementHandler(this,&TagFileParser::startStringValue));
- m_startElementHandlers.insert("file", new StartElementHandler(this,&TagFileParser::startStringValue));
- m_startElementHandlers.insert("dir", new StartElementHandler(this,&TagFileParser::startStringValue));
- m_startElementHandlers.insert("page", new StartElementHandler(this,&TagFileParser::startStringValue));
- m_startElementHandlers.insert("docanchor", new StartElementHandler(this,&TagFileParser::startDocAnchor));
- m_startElementHandlers.insert("tagfile", new StartElementHandler(this,&TagFileParser::startIgnoreElement));
- m_startElementHandlers.insert("templarg", new StartElementHandler(this,&TagFileParser::startStringValue));
- m_startElementHandlers.insert("type", new StartElementHandler(this,&TagFileParser::startStringValue));
-
- m_endElementHandlers.insert("compound", new EndElementHandler(this,&TagFileParser::endCompound));
- m_endElementHandlers.insert("member", new EndElementHandler(this,&TagFileParser::endMember));
- m_endElementHandlers.insert("name", new EndElementHandler(this,&TagFileParser::endName));
- m_endElementHandlers.insert("base", new EndElementHandler(this,&TagFileParser::endBase));
- m_endElementHandlers.insert("filename", new EndElementHandler(this,&TagFileParser::endFilename));
- m_endElementHandlers.insert("includes", new EndElementHandler(this,&TagFileParser::endIncludes));
- m_endElementHandlers.insert("path", new EndElementHandler(this,&TagFileParser::endPath));
- m_endElementHandlers.insert("anchorfile", new EndElementHandler(this,&TagFileParser::endAnchorFile));
- m_endElementHandlers.insert("anchor", new EndElementHandler(this,&TagFileParser::endAnchor));
- m_endElementHandlers.insert("arglist", new EndElementHandler(this,&TagFileParser::endArglist));
- m_endElementHandlers.insert("title", new EndElementHandler(this,&TagFileParser::endTitle));
- m_endElementHandlers.insert("subgroup", new EndElementHandler(this,&TagFileParser::endSubgroup));
- m_endElementHandlers.insert("class" , new EndElementHandler(this,&TagFileParser::endClass));
- m_endElementHandlers.insert("namespace", new EndElementHandler(this,&TagFileParser::endNamespace));
- m_endElementHandlers.insert("file", new EndElementHandler(this,&TagFileParser::endFile));
- m_endElementHandlers.insert("dir", new EndElementHandler(this,&TagFileParser::endDir));
- m_endElementHandlers.insert("page", new EndElementHandler(this,&TagFileParser::endPage));
- m_endElementHandlers.insert("docanchor", new EndElementHandler(this,&TagFileParser::endDocAnchor));
- m_endElementHandlers.insert("tagfile", new EndElementHandler(this,&TagFileParser::endIgnoreElement));
- m_endElementHandlers.insert("templarg", new EndElementHandler(this,&TagFileParser::endTemplateArg));
- m_endElementHandlers.insert("type", new EndElementHandler(this,&TagFileParser::endType));
-
- return TRUE;
- }
-
- bool startElement( const QString&, const QString&,
- const QString&name, const QXmlAttributes& attrib )
- {
- //printf("startElement `%s'\n",name.data());
- StartElementHandler *handler = m_startElementHandlers[name];
- if (handler)
- {
- (*handler)(attrib);
- }
- else
- {
- warn("Warning: Unknown tag `%s' found!\n",name.data());
- }
- return TRUE;
- }
-
- bool endElement( const QString&, const QString&, const QString& name )
- {
- //printf("endElement `%s'\n",name.data());
- EndElementHandler *handler = m_endElementHandlers[name];
- if (handler)
- {
- (*handler)();
- }
- else
- {
- warn("Warning: Unknown tag `%s' found!\n",name.data());
- }
- return TRUE;
- }
-
- bool characters ( const QString & ch )
- {
- m_curString+=ch;
- return TRUE;
- }
-
- void dump();
- void buildLists(Entry *root);
- void addIncludes();
-
- private:
- void buildMemberList(Entry *ce,QList<TagMemberInfo> &members);
- void addDocAnchors(Entry *e,const TagAnchorInfoList &l);
- QList<TagClassInfo> m_tagFileClasses;
- QList<TagFileInfo> m_tagFileFiles;
- QList<TagNamespaceInfo> m_tagFileNamespaces;
- QList<TagGroupInfo> m_tagFileGroups;
- QList<TagPageInfo> m_tagFilePages;
- QList<TagPackageInfo> m_tagFilePackages;
- QList<TagDirInfo> m_tagFileDirs;
- QDict<StartElementHandler> m_startElementHandlers;
- QDict<EndElementHandler> m_endElementHandlers;
- TagClassInfo *m_curClass;
- TagFileInfo *m_curFile;
- TagNamespaceInfo *m_curNamespace;
- TagPackageInfo *m_curPackage;
- TagGroupInfo *m_curGroup;
- TagPageInfo *m_curPage;
- TagDirInfo *m_curDir;
- TagMemberInfo *m_curMember;
- TagIncludeInfo *m_curIncludes;
- QCString m_curString;
- QString m_tagName;
- QString m_fileName;
- State m_state;
- QStack<State> m_stateStack;
- QXmlLocator *m_locator;
- QString m_inputFileName;
-};
-
-/*! Error handler for the XML tag file parser.
- * Basically dumps all fatal error to stderr using err().
- */
-class TagFileErrorHandler : public QXmlErrorHandler
-{
- public:
- virtual ~TagFileErrorHandler() {}
- bool warning( const QXmlParseException & )
- {
- return FALSE;
- }
- bool error( const QXmlParseException & )
- {
- return FALSE;
- }
- bool fatalError( const QXmlParseException &exception )
- {
- err("Fatal error at line %d column %d: %s\n",
- exception.lineNumber(),exception.columnNumber(),
- exception.message().data());
- return FALSE;
- }
- QString errorString() { return ""; }
-
- private:
- QString errorMsg;
-};
-
-/*! Dumps the internal structures. For debugging only! */
-void TagFileParser::dump()
-{
- msg("Result:\n");
- QListIterator<TagClassInfo> lci(m_tagFileClasses);
-
- //============== CLASSES
- TagClassInfo *cd;
- for (;(cd=lci.current());++lci)
- {
- msg("class `%s'\n",cd->name.data());
- msg(" filename `%s'\n",cd->filename.data());
- if (cd->bases)
- {
- QListIterator<BaseInfo> bii(*cd->bases);
- BaseInfo *bi;
- for ( bii.toFirst() ; (bi=bii.current()) ; ++bii)
- {
- msg( " base: %s \n", bi->name.data() );
- }
- }
-
- QListIterator<TagMemberInfo> mci(cd->members);
- TagMemberInfo *md;
- for (;(md=mci.current());++mci)
- {
- msg(" member:\n");
- msg(" kind: `%s'\n",md->kind.data());
- msg(" name: `%s'\n",md->name.data());
- msg(" anchor: `%s'\n",md->anchor.data());
- msg(" arglist: `%s'\n",md->arglist.data());
- }
- }
- //============== NAMESPACES
- QListIterator<TagNamespaceInfo> lni(m_tagFileNamespaces);
- TagNamespaceInfo *nd;
- for (;(nd=lni.current());++lni)
- {
- msg("namespace `%s'\n",nd->name.data());
- msg(" filename `%s'\n",nd->filename.data());
- QStringList::Iterator it;
- for ( it = nd->classList.begin();
- it != nd->classList.end(); ++it )
- {
- msg( " class: %s \n", (*it).latin1() );
- }
-
- QListIterator<TagMemberInfo> mci(nd->members);
- TagMemberInfo *md;
- for (;(md=mci.current());++mci)
- {
- msg(" member:\n");
- msg(" kind: `%s'\n",md->kind.data());
- msg(" name: `%s'\n",md->name.data());
- msg(" anchor: `%s'\n",md->anchor.data());
- msg(" arglist: `%s'\n",md->arglist.data());
- }
- }
- //============== FILES
- QListIterator<TagFileInfo> lfi(m_tagFileFiles);
- TagFileInfo *fd;
- for (;(fd=lfi.current());++lfi)
- {
- msg("file `%s'\n",fd->name.data());
- msg(" filename `%s'\n",fd->filename.data());
- QStringList::Iterator it;
- for ( it = fd->namespaceList.begin();
- it != fd->namespaceList.end(); ++it )
- {
- msg( " namespace: %s \n", (*it).latin1() );
- }
- for ( it = fd->classList.begin();
- it != fd->classList.end(); ++it )
- {
- msg( " class: %s \n", (*it).latin1() );
- }
-
- QListIterator<TagMemberInfo> mci(fd->members);
- TagMemberInfo *md;
- for (;(md=mci.current());++mci)
- {
- msg(" member:\n");
- msg(" kind: `%s'\n",md->kind.data());
- msg(" name: `%s'\n",md->name.data());
- msg(" anchor: `%s'\n",md->anchor.data());
- msg(" arglist: `%s'\n",md->arglist.data());
- }
-
- QListIterator<TagIncludeInfo> mii(fd->includes);
- TagIncludeInfo *ii;
- for (;(ii=mii.current());++mii)
- {
- msg(" includes id: %s name: %s\n",ii->id.data(),ii->name.data());
- }
- }
-
- //============== GROUPS
- QListIterator<TagGroupInfo> lgi(m_tagFileGroups);
- TagGroupInfo *gd;
- for (;(gd=lgi.current());++lgi)
- {
- msg("group `%s'\n",gd->name.data());
- msg(" filename `%s'\n",gd->filename.data());
- QStringList::Iterator it;
- for ( it = gd->namespaceList.begin();
- it != gd->namespaceList.end(); ++it )
- {
- msg( " namespace: %s \n", (*it).latin1() );
- }
- for ( it = gd->classList.begin();
- it != gd->classList.end(); ++it )
- {
- msg( " class: %s \n", (*it).latin1() );
- }
- for ( it = gd->fileList.begin();
- it != gd->fileList.end(); ++it )
- {
- msg( " file: %s \n", (*it).latin1() );
- }
- for ( it = gd->subgroupList.begin();
- it != gd->subgroupList.end(); ++it )
- {
- msg( " subgroup: %s \n", (*it).latin1() );
- }
- for ( it = gd->pageList.begin();
- it != gd->pageList.end(); ++it )
- {
- msg( " page: %s \n", (*it).latin1() );
- }
-
- QListIterator<TagMemberInfo> mci(gd->members);
- TagMemberInfo *md;
- for (;(md=mci.current());++mci)
- {
- msg(" member:\n");
- msg(" kind: `%s'\n",md->kind.data());
- msg(" name: `%s'\n",md->name.data());
- msg(" anchor: `%s'\n",md->anchor.data());
- msg(" arglist: `%s'\n",md->arglist.data());
- }
- }
- //============== PAGES
- QListIterator<TagPageInfo> lpi(m_tagFilePages);
- TagPageInfo *pd;
- for (;(pd=lpi.current());++lpi)
- {
- msg("page `%s'\n",pd->name.data());
- msg(" title `%s'\n",pd->title.data());
- msg(" filename `%s'\n",pd->filename.data());
- }
- //============== DIRS
- QListIterator<TagDirInfo> ldi(m_tagFileDirs);
- TagDirInfo *dd;
- for (;(dd=ldi.current());++ldi)
- {
- msg("dir `%s'\n",dd->name.data());
- msg(" path `%s'\n",dd->path.data());
- QStringList::Iterator it;
- for ( it = dd->fileList.begin();
- it != dd->fileList.end(); ++it )
- {
- msg( " file: %s \n", (*it).latin1() );
- }
- for ( it = dd->subdirList.begin();
- it != dd->subdirList.end(); ++it )
- {
- msg( " subdir: %s \n", (*it).latin1() );
- }
- }
-}
-
-void TagFileParser::addDocAnchors(Entry *e,const TagAnchorInfoList &l)
-{
- QListIterator<TagAnchorInfo> tli(l);
- TagAnchorInfo *ta;
- for (tli.toFirst();(ta=tli.current());++tli)
- {
- if (Doxygen::sectionDict.find(ta->label)==0)
- {
- //printf("New sectionInfo file=%s anchor=%s\n",
- // ta->fileName.data(),ta->label.data());
- SectionInfo *si=new SectionInfo(ta->fileName,ta->label,ta->label,
- SectionInfo::Anchor,m_tagName);
- Doxygen::sectionDict.insert(ta->label,si);
- e->anchors->append(si);
- }
- else
- {
- warn("Duplicate anchor %s found\n",ta->label.data());
- }
- }
-}
-
-void TagFileParser::buildMemberList(Entry *ce,QList<TagMemberInfo> &members)
-{
- QListIterator<TagMemberInfo> mii(members);
- TagMemberInfo *tmi;
- for (;(tmi=mii.current());++mii)
- {
- Entry *me = new Entry;
- me->type = tmi->type;
- me->name = tmi->name;
- me->args = tmi->arglist;
- if (!me->args.isEmpty())
- {
- delete me->argList;
- me->argList = new ArgumentList;
- stringToArgumentList(me->args,me->argList);
- }
- me->protection = tmi->prot;
- me->virt = tmi->virt;
- me->stat = tmi->isStatic;
- me->fileName = ce->fileName;
- if (ce->section == Entry::GROUPDOC_SEC)
- {
- me->groups->append(new Grouping(ce->name,Grouping::GROUPING_INGROUP));
- }
- addDocAnchors(me,tmi->docAnchors);
- TagInfo *ti = new TagInfo;
- ti->tagName = m_tagName;
- ti->anchor = tmi->anchor;
- ti->fileName = tmi->anchorFile;
- me->tagInfo = ti;
- if (tmi->kind=="define")
- {
- me->type="#define";
- me->section = Entry::DEFINE_SEC;
- }
- else if (tmi->kind=="enumvalue")
- {
- me->section = Entry::VARIABLE_SEC;
- me->mtype = Method;
- }
- else if (tmi->kind=="property")
- {
- me->section = Entry::VARIABLE_SEC;
- me->mtype = Property;
- }
- else if (tmi->kind=="event")
- {
- me->section = Entry::VARIABLE_SEC;
- me->mtype = Event;
- }
- else if (tmi->kind=="variable")
- {
- me->section = Entry::VARIABLE_SEC;
- me->mtype = Method;
- }
- else if (tmi->kind=="typedef")
- {
- me->section = Entry::VARIABLE_SEC; //Entry::TYPEDEF_SEC;
- me->type.prepend("typedef ");
- me->mtype = Method;
- }
- else if (tmi->kind=="enumeration")
- {
- me->section = Entry::ENUM_SEC;
- me->mtype = Method;
- }
- else if (tmi->kind=="function")
- {
- me->section = Entry::FUNCTION_SEC;
- me->mtype = Method;
- }
- else if (tmi->kind=="signal")
- {
- me->section = Entry::FUNCTION_SEC;
- me->mtype = Signal;
- }
- else if (tmi->kind=="prototype")
- {
- me->section = Entry::FUNCTION_SEC;
- me->mtype = Method;
- }
- else if (tmi->kind=="friend")
- {
- me->section = Entry::FUNCTION_SEC;
- me->type.prepend("friend ");
- me->mtype = Method;
- }
- else if (tmi->kind=="dcop")
- {
- me->section = Entry::FUNCTION_SEC;
- me->mtype = DCOP;
- }
- else if (tmi->kind=="slot")
- {
- me->section = Entry::FUNCTION_SEC;
- me->mtype = Slot;
- }
- ce->addSubEntry(me);
- }
-}
-
-static QString stripPath(const QString &s)
-{
- int i=s.findRev('/');
- if (i!=-1)
- {
- return s.right(s.length()-i-1);
- }
- else
- {
- return s;
- }
-}
-
-/*! Injects the info gathered by the XML parser into the Entry tree.
- * This tree contains the information extracted from the input in a
- * "unrelated" form.
- */
-void TagFileParser::buildLists(Entry *root)
-{
- // build class list
- TagClassInfo *tci = m_tagFileClasses.first();
- while (tci)
- {
- Entry *ce = new Entry;
- switch (tci->kind)
- {
- case TagClassInfo::Class: ce->section = Entry::CLASS_SEC; break;
- case TagClassInfo::Struct: ce->section = Entry::STRUCT_SEC; break;
- case TagClassInfo::Union: ce->section = Entry::UNION_SEC; break;
- case TagClassInfo::Interface: ce->section = Entry::INTERFACE_SEC; break;
- case TagClassInfo::Exception: ce->section = Entry::EXCEPTION_SEC; break;
- case TagClassInfo::Protocol: ce->section = Entry::PROTOCOL_SEC; break;
- case TagClassInfo::Category: ce->section = Entry::CATEGORY_SEC; break;
- }
- ce->name = tci->name;
- addDocAnchors(ce,tci->docAnchors);
- TagInfo *ti = new TagInfo;
- ti->tagName = m_tagName;
- ti->fileName = tci->filename;
- ce->tagInfo = ti;
- ce->objc = tci->isObjC;
- // transfer base class list
- if (tci->bases)
- {
- delete ce->extends;
- ce->extends = tci->bases; tci->bases = 0;
- }
- if (tci->templateArguments)
- {
- if (ce->tArgLists==0)
- {
- ce->tArgLists = new QList<ArgumentList>;
- ce->tArgLists->setAutoDelete(TRUE);
- }
- ArgumentList *al = new ArgumentList;
- ce->tArgLists->append(al);
-
- QListIterator<QString> sli(*tci->templateArguments);
- QString *argName;
- for (;(argName=sli.current());++sli)
- {
- Argument *a = new Argument;
- a->type = "class";
- a->name = *argName;
- al->append(a);
- }
- }
-
- buildMemberList(ce,tci->members);
- root->addSubEntry(ce);
- tci = m_tagFileClasses.next();
- }
-
- // build file list
- TagFileInfo *tfi = m_tagFileFiles.first();
- while (tfi)
- {
- Entry *fe = new Entry;
- fe->section = guessSection(tfi->name);
- fe->name = tfi->name;
- addDocAnchors(fe,tfi->docAnchors);
- TagInfo *ti = new TagInfo;
- ti->tagName = m_tagName;
- ti->fileName = tfi->filename;
- fe->tagInfo = ti;
-
- QString fullName = m_tagName+":"+tfi->path+stripPath(tfi->name);
- fe->fileName = fullName;
- //printf("new FileDef() filename=%s\n",tfi->filename.data());
- FileDef *fd = new FileDef(m_tagName+":"+tfi->path,
- tfi->name,m_tagName,
- tfi->filename
- );
- FileName *mn;
- if ((mn=Doxygen::inputNameDict->find(tfi->name)))
- {
- mn->append(fd);
- }
- else
- {
- mn = new FileName(fullName,tfi->name);
- mn->append(fd);
- Doxygen::inputNameList.inSort(mn);
- Doxygen::inputNameDict->insert(tfi->name,mn);
- }
- buildMemberList(fe,tfi->members);
- root->addSubEntry(fe);
- tfi = m_tagFileFiles.next();
- }
-
- // build namespace list
- TagNamespaceInfo *tni = m_tagFileNamespaces.first();
- while (tni)
- {
- Entry *ne = new Entry;
- ne->section = Entry::NAMESPACE_SEC;
- ne->name = tni->name;
- addDocAnchors(ne,tni->docAnchors);
- TagInfo *ti = new TagInfo;
- ti->tagName = m_tagName;
- ti->fileName = tni->filename;
- ne->tagInfo = ti;
-
- buildMemberList(ne,tni->members);
- root->addSubEntry(ne);
- tni = m_tagFileNamespaces.next();
- }
-
- // build package list
- TagPackageInfo *tpgi = m_tagFilePackages.first();
- while (tpgi)
- {
- Entry *pe = new Entry;
- pe->section = Entry::PACKAGE_SEC;
- pe->name = tpgi->name;
- addDocAnchors(pe,tpgi->docAnchors);
- TagInfo *ti = new TagInfo;
- ti->tagName = m_tagName;
- ti->fileName = tpgi->filename;
- pe->tagInfo = ti;
-
- buildMemberList(pe,tpgi->members);
- root->addSubEntry(pe);
- tpgi = m_tagFilePackages.next();
- }
-
- // build group list, but only if config file says to include it
- //if (Config_getBool("EXTERNAL_GROUPS"))
- //{
- TagGroupInfo *tgi = m_tagFileGroups.first();
- while (tgi)
- {
- Entry *ge = new Entry;
- ge->section = Entry::GROUPDOC_SEC;
- ge->name = tgi->name;
- ge->type = tgi->title;
- addDocAnchors(ge,tgi->docAnchors);
- TagInfo *ti = new TagInfo;
- ti->tagName = m_tagName;
- ti->fileName = tgi->filename;
- ge->tagInfo = ti;
-
- buildMemberList(ge,tgi->members);
- root->addSubEntry(ge);
- tgi = m_tagFileGroups.next();
- }
- //}
-
- // build page list
- TagPageInfo *tpi = m_tagFilePages.first();
- while (tpi)
- {
- Entry *pe = new Entry;
- pe->section = Entry::PAGEDOC_SEC;
- pe->name = tpi->name;
- pe->args = tpi->title;
- addDocAnchors(pe,tpi->docAnchors);
- TagInfo *ti = new TagInfo;
- ti->tagName = m_tagName;
- ti->fileName = tpi->filename;
- pe->tagInfo = ti;
-
- root->addSubEntry(pe);
- tpi = m_tagFilePages.next();
- }
-}
-
-void TagFileParser::addIncludes()
-{
- TagFileInfo *tfi = m_tagFileFiles.first();
- while (tfi)
- {
- //printf("tag file tagName=%s path=%s name=%s\n",m_tagName.data(),tfi->path.data(),tfi->name.data());
- FileName *fn = Doxygen::inputNameDict->find(tfi->name);
- if (fn)
- {
- //printf("found\n");
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (;(fd=fni.current());++fni)
- {
- //printf("input file path=%s name=%s\n",fd->getPath().data(),fd->name().data());
- if (fd->getPath()==QCString(m_tagName+":"+tfi->path))
- {
- //printf("found\n");
- QListIterator<TagIncludeInfo> mii(tfi->includes);
- TagIncludeInfo *ii;
- for (;(ii=mii.current());++mii)
- {
- //printf("ii->name=`%s'\n",ii->name.data());
- FileName *ifn = Doxygen::inputNameDict->find(ii->name);
- ASSERT(ifn!=0);
- if (ifn)
- {
- FileNameIterator ifni(*ifn);
- FileDef *ifd;
- for (;(ifd=ifni.current());++ifni)
- {
- //printf("ifd->getOutputFileBase()=%s ii->id=%s\n",
- // ifd->getOutputFileBase().data(),ii->id.data());
- if (ifd->getOutputFileBase()==QCString(ii->id))
- {
- fd->addIncludeDependency(ifd,ii->text,ii->isLocal,ii->isImported);
- }
- }
- }
- }
- }
- }
- }
- tfi = m_tagFileFiles.next();
- }
-}
-
-void parseTagFile(Entry *root,const char *fullName,const char *tagName)
-{
- QFileInfo fi(fullName);
- if (!fi.exists()) return;
- TagFileParser handler( tagName );
- handler.setFileName(fullName);
- TagFileErrorHandler errorHandler;
- QFile xmlFile( fullName );
- QXmlInputSource source( xmlFile );
- QXmlSimpleReader reader;
- reader.setContentHandler( &handler );
- reader.setErrorHandler( &errorHandler );
- reader.parse( source );
- handler.buildLists(root);
- handler.addIncludes();
-}
-
-