📄 tagreader.cpp
字号:
/****************************************************************************** * * $Id: tagreader.cpp,v 1.2 2001/03/19 19:27:41 root Exp $ * * * Copyright (C) 1997-2001 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 <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 "reflist.h"/*! 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 anchor; QString arglist; QString kind; QStrList 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 }; TagClassInfo() { bases=0, templateArguments=0; members.setAutoDelete(TRUE); } ~TagClassInfo() { delete bases; delete templateArguments; } QString name; QString filename; QStrList docAnchors; QList<BaseInfo> *bases; QList<TagMemberInfo> members; QList<QString> *templateArguments; Kind kind;};/*! Container for namespace specific info that can be read from a tagfile */class TagNamespaceInfo{ public: TagNamespaceInfo() { members.setAutoDelete(TRUE); } QString name; QString filename; QStrList docAnchors; QList<TagMemberInfo> members; QStringList classList;};/*! Container for package specific info that can be read from a tagfile */class TagPackageInfo{ public: TagPackageInfo() { members.setAutoDelete(TRUE); } QString name; QString filename; QStrList docAnchors; QList<TagMemberInfo> members; QStringList classList;};/*! Container for file specific info that can be read from a tagfile */class TagFileInfo{ public: TagFileInfo() { members.setAutoDelete(TRUE); } QString name; QString path; QString filename; QStrList docAnchors; QList<TagMemberInfo> members; QStringList classList; QStringList namespaceList;};/*! 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; QStrList docAnchors; QList<TagMemberInfo> members; QStringList subgroupList; QStringList classList; QStringList namespaceList; QStringList fileList; QStringList pageList;};/*! Container for page specific info that can be read from a tagfile */class TagPageInfo{ public: QString name; QString title; QString filename; QStrList 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, 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) { } void startCompound( const QXmlAttributes& attrib ) { m_curString = ""; QString kind = attrib.value("kind"); 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=="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 { err("Error: Unknown compound attribute `%s' found!\n",kind.data()); } } 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 InPackage: m_tagFilePackages.append(m_curPackage); m_curPackage=0; break; default: err("Error: 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.pop(); 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: err("Error: Unexpected tag `member' found\n"); break; } } void endDocAnchor() { switch(m_state) { case InClass: m_curClass->docAnchors.append(m_curString); break; case InFile: m_curFile->docAnchors.append(m_curString); break; case InNamespace: m_curNamespace->docAnchors.append(m_curString); break; case InGroup: m_curGroup->docAnchors.append(m_curString); break; case InPage: m_curPage->docAnchors.append(m_curString); break; case InMember: m_curMember->docAnchors.append(m_curString); break; case InPackage: m_curPackage->docAnchors.append(m_curString); break; default: err("Error: Unexpected tag `member' found\n"); break; } } void endClass() { switch(m_state) { 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: err("Error: Unexpected tag `class' found\n"); break; } } void endNamespace() { switch(m_state) { case InFile: m_curFile->namespaceList.append(m_curString); break; case InGroup: m_curGroup->namespaceList.append(m_curString); break; default: err("Error: Unexpected tag `namespace' found\n"); break; } } void endFile() { switch(m_state) { case InGroup: m_curGroup->fileList.append(m_curString); break; default: err("Error: Unexpected tag `file' found\n"); break; } } void endPage() { switch(m_state) { case InGroup: m_curGroup->fileList.append(m_curString); break; default: err("Error: Unexpected tag `page' found\n"); break; } } void startStringValue(const QXmlAttributes& ) { m_curString = ""; } void endType() { if (m_state==InMember) { m_curMember->type = m_curString; } else { err("Error: Unexpected tag `type' found\n"); } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -