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

📄 tagreader.cpp

📁 doxygen(一个自动从源代码生成文档的工具)的源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    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 InMember:    m_curMember->name    = m_curString; break;        case InPackage:   m_curPackage->name   = m_curString; break;        default: err("Error: 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      {        err("Error: Unexpected tag `base' found\n");      }    }    void endBase()    {      if (m_state==InClass && m_curClass)      {        m_curClass->bases->getLast()->name = m_curString;      }      else      {        err("Error: Unexpected tag `base' found\n");      }    }    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      {        err("Error: 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;        default: err("Error: Unexpected tag `filename' found\n"); break;       }    }    void endPath()    {      switch (m_state)      {        case InFile:      m_curFile->path          = m_curString;    break;        default: err("Error: Unexpected tag `path' found\n");     break;       }    }    void endAnchor()    {      if (m_state==InMember)      {        m_curMember->anchor = m_curString;       }      else      {        err("Error: Unexpected tag `anchor' found\n");      }    }    void endArglist()    {      if (m_state==InMember)      {        m_curMember->arglist = m_curString;       }      else      {        err("Error: 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: err("Error: Unexpected tag `title' found\n"); break;       }    }    void endSubgroup()    {      if (m_state==InGroup)      {        m_curGroup->subgroupList.append(m_curString);      }      else      {        err("Error: 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_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_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("path",        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("page",        new StartElementHandler(this,&TagFileParser::startStringValue));      m_startElementHandlers.insert("docanchor",   new StartElementHandler(this,&TagFileParser::startStringValue));      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("path",        new EndElementHandler(this,&TagFileParser::endPath));      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("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       {        err("Error: 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       {        err("Error: 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);      private:    void buildMemberList(Entry *ce,QList<TagMemberInfo> &members);    void addDocAnchors(Entry *e,QStrList &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;    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;    TagMemberInfo             *m_curMember;    QCString                   m_curString;    QString                    m_tagName;    State                      m_state;    QStack<State>              m_stateStack;};/*! 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");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -