📄 tagreader.cpp
字号:
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 + -