⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tagreader.cpp

📁 doxygen(一个自动从源代码生成文档的工具)的源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/****************************************************************************** * * $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 + -