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

📄 srcparser.cpp

📁 wxGTK 是 wxWidgets 的 linux GTK+ (>2.2.3)版本。wxWidgets 是一个跨平台的 GUI 框架
💻 CPP
字号:
/////////////////////////////////////////////////////////////////////////////// Name:        No names yet.// Purpose:     Contrib. demo// Author:      Aleksandras Gluchovas// Modified by:// Created:     22/09/98// RCS-ID:      $Id: srcparser.cpp,v 1.18 2006/07/18 16:23:52 MW Exp $// Copyright:   (c) Aleskandars Gluchovas// Licence:     wxWindows licence/////////////////////////////////////////////////////////////////////////////// For compilers that support precompilation, includes "wx/wx.h".#include "wx/wxprec.h"#ifdef __BORLANDC__#pragma hdrstop#endif#ifndef WX_PRECOMP#include "wx/wx.h"#endif#include <stdio.h>#include "srcparser.h"/***** Implementation for class spVisitor *****/void spVisitor::VisitAll( spContext& atContext,                          bool sortContent                        ){    mSiblingSkipped = false;    mChildSkipped   = false;    mContextMask    = SP_CTX_ANY; // FIXME:: should be an arg.    if ( sortContent && !atContext.IsSorted() )        atContext.SortMembers();    mpCurCxt = &atContext; // FIXME:: this is dirty, restoring it each time    if ( atContext.GetContextType() & mContextMask )        atContext.AcceptVisitor( *this );    MMemberListT& members = atContext.GetMembers();    for( size_t i = 0; i != members.size(); ++i )    {        if ( mSiblingSkipped )            return;        if ( !mChildSkipped )        {            size_t prevSz = members.size();            // visit members of the context recursivelly            VisitAll( *members[i], sortContent );            if ( members.size() != prevSz )                --i; // current member was removed!            mChildSkipped = 0;        }    }}void spVisitor::RemoveCurrentContext(){    if ( mpCurCxt->GetParent() )        mpCurCxt->GetParent()->RemoveChild( mpCurCxt );}void spVisitor::SkipSiblings(){    mSiblingSkipped = true;}void spVisitor::SkipChildren(){    mChildSkipped = true;}void spVisitor::SetFilter( int contextMask ){    mContextMask = contextMask;}/***** Implementation for class spComment *****/bool spComment::IsMultiline()  const{    return mIsMultiline;}bool spComment::StartsParagraph() const{    return mStartsPar;}wxString& spComment::GetText(){    return m_Text;}wxString spComment::GetText() const{    return m_Text;}/***** Implementation for class spContext *****/spContext::spContext()    : m_pParent        ( NULL ),      mpFirstOccurence( NULL ),      mAlreadySorted  ( false ),      mSrcLineNo    (-1),      mSrcOffset    (-1),      mContextLength(-1),      mLastScrLineNo(-1),      mHeaderLength (-1),      mFooterLength (-1),      mFirstCharPos (-1),      mLastCharPos  (-1),      mVisibility( SP_VIS_PRIVATE ),      mIsVirtualContext         ( false ),      mVirtualContextHasChildren( false ),      mpUserData( NULL ){}void spContext::RemoveChildren(){    for( size_t i = 0; i != mMembers.size(); ++i )        delete mMembers[i];    mMembers.erase( mMembers.begin(), mMembers.end() );}spContext::~spContext(){    RemoveChildren();    for( size_t i = 0; i != mComments.size(); ++i )        delete mComments[i];}bool spContext::IsSorted(){    return mAlreadySorted;}void spContext::GetContextList( MMemberListT& lst, int contextMask ){    for( size_t i = 0; i != mMembers.size(); ++i )    {        spContext& member = *mMembers[i];        if ( member.GetContextType() & contextMask )            lst.push_back( &member );        // collect required contexts recursively        member.GetContextList( lst, contextMask );    }}bool spContext::HasComments(){    return ( mComments.size() != 0 );}void spContext::RemoveChild( spContext* pChild ){    for( size_t i = 0; i != mMembers.size(); ++i )        if ( mMembers[i] == pChild )        {            mMembers.erase( &mMembers[i] );            delete pChild;            return;        }    // the given child should exist on the parent's list    wxASSERT( 0 );}spContext* spContext::GetEnclosingContext( int mask ){    spContext* cur = this->GetParent();    while ( cur && !(cur->GetContextType() & mask) )        cur = cur->GetParent();    return cur;}bool spContext::PositionIsKnown(){    return ( mSrcOffset != (-1) && mContextLength != (-1) );}bool spContext::IsVirtualContext(){    return mIsVirtualContext;}bool spContext::VitualContextHasChildren(){    return mVirtualContextHasChildren;}wxString spContext::GetVirtualContextBody(){    wxASSERT( mIsVirtualContext );    return mVirtualContextBody;}wxString spContext::GetFooterOfVirtualContextBody(){    wxASSERT( mIsVirtualContext );    return mVittualContextFooter;}void spContext::SetVirtualContextBody( const wxString& body,                                       bool            hasChildren,                                       const wxString& footer ){    mVirtualContextHasChildren = hasChildren;    mVirtualContextBody   = body;    mVittualContextFooter = footer;    // atuomaticllay becomes virtual context    mIsVirtualContext   = true;}wxString spContext::GetBody( spContext* pCtx ){    if ( ( pCtx == NULL || pCtx == this ) && mIsVirtualContext )        return mVirtualContextBody;    if ( GetParent() )        return GetParent()->GetBody( ( pCtx != NULL ) ? pCtx : this );    else        return wxEmptyString; // source-fragment cannot be found}wxString spContext::GetHeader( spContext* pCtx ){    if ( GetParent() )        return GetParent()->GetHeader( ( pCtx != NULL ) ? pCtx : this );    else        return wxEmptyString; // source-fragment cannot be found}bool spContext::IsFirstOccurence(){    return ( mpFirstOccurence != 0 );}spContext* spContext::GetFirstOccurence(){    // this object should not itself be    // the first occurence of the context    wxASSERT( mpFirstOccurence != 0 );    return mpFirstOccurence;}void spContext::AddMember( spContext* pMember ){    mMembers.push_back( pMember );    pMember->m_pParent = this;}void spContext::AddComment( spComment* pComment ){    mComments.push_back( pComment );}MMemberListT& spContext::GetMembers(){    return mMembers;}spContext* spContext::FindContext( const wxString& identifier,                                   int   contextType,                                   bool  searchSubMembers                                 ){    for( size_t i = 0; i != mMembers.size(); ++i )    {        spContext& member = *mMembers[i];        if ( member.GetName() == identifier &&             ( contextType & member.GetContextType() )           )           return &member;        if ( searchSubMembers )        {            spContext* result =                member.FindContext( identifier, contextType, 1 );            if ( result ) return result;        }    }    return 0;}void spContext::RemoveThisContext(){    if ( m_pParent )        m_pParent->RemoveChild( this );    else        // context should have a parent        wxFAIL_MSG("Context should have a parent");}spContext* spContext::GetOutterContext(){    return m_pParent;}bool spContext::HasOutterContext(){    return ( m_pParent != 0 );}bool spContext::IsInFile(){    return ( GetOutterContext()->GetContextType() == SP_CTX_FILE );}bool spContext::IsInNameSpace(){    return ( GetOutterContext()->GetContextType() == SP_CTX_NAMESPACE );}bool spContext::IsInClass(){    return ( GetOutterContext()->GetContextType() == SP_CTX_CLASS );}bool spContext::IsInOperation(){    return ( GetOutterContext()->GetContextType() == SP_CTX_OPERATION );}spClass& spContext::GetClass(){    wxASSERT( GetOutterContext()->GetType() == SP_CTX_CLASS );    return *((spClass*)m_pParent );}spFile& spContext::GetFile(){    wxASSERT( GetOutterContext()->GetType() == SP_CTX_FILE );    return *((spFile*)m_pParent );}spNameSpace& spContext::GetNameSpace(){    wxASSERT( GetOutterContext()->GetType() == SP_CTX_NAMESPACE );    return *((spNameSpace*)m_pParent );}spOperation& spContext::GetOperation(){    wxASSERT( GetOutterContext()->GetType() == SP_CTX_OPERATION );    return *((spOperation*)m_pParent );}/***** Implementation for class spClass *****/void spClass::SortMembers(){    // TBD::}/***** Implementation for class spOperation *****/spOperation::spOperation()    : mHasDefinition( false ){    mIsConstant =    mIsVirtual =    mHasDefinition = false;}wxString spOperation::GetFullName(MarkupTagsT tags){    wxString txt = tags[TAG_BOLD].start + m_RetType;    txt += _T(" ");    txt += m_Name;    txt += _T("( ");    txt += tags[TAG_BOLD].end;    for( size_t i = 0; i != mMembers.size(); ++i )    {        // DBG::        wxASSERT( mMembers[i]->GetContextType() == SP_CTX_PARAMETER );        spParameter& param = *((spParameter*)mMembers[i]);        if ( i != 0 )            txt += _T(", ");        txt += tags[TAG_BOLD].start;        txt += param.m_Type;        txt += tags[TAG_BOLD].end;        txt += tags[TAG_ITALIC].start;        txt += _T(" ");        txt += param.m_Name;        if ( !param.m_InitVal.empty() )        {            txt += _T(" = ");            txt += tags[TAG_BOLD].start;            txt += param.m_InitVal;            txt += tags[TAG_BOLD].end;        }        txt += tags[TAG_ITALIC].end;;    }    txt += tags[TAG_BOLD].start;    txt += " )";    txt += tags[TAG_BOLD].end;    // TBD:: constantness of method    return txt;}/***** Implemenentation for class spPreprocessorLine *****/wxString spPreprocessorLine::CPP_GetIncludedFileNeme() const{    wxASSERT( GetStatementType() == SP_PREP_DEF_INCLUDE_FILE );    size_t i = 0;    while( i < m_Line.length() && m_Line[i] != _T('"') && m_Line[i] != _T('<') )        ++i;    ++i;    size_t start = i;    while( i < m_Line.length() && m_Line[i] != _T('"') && m_Line[i] != _T('>') )        ++i;    if ( start < m_Line.length() )    {        wxString fname;        fname.append( m_Line, start, ( i - start ) );        return fname;    }    else        return wxEmptyString; // syntax error probably}/***** Implemenentation for class SourceParserBase *****/SourceParserBase::SourceParserBase()    : mpFileBuf( NULL ),      mFileBufSz( 0 ),      mpPlugin( NULL ){}SourceParserBase::~SourceParserBase(){    if ( mpFileBuf ) free( mpFileBuf );    if ( mpPlugin ) delete mpPlugin;}spFile* SourceParserBase::ParseFile( const char* fname ){    // FIXME:: the below should not be fixed!    const size_t MAX_BUF_SIZE = 1024*256;    if ( !mpFileBuf ) mpFileBuf = (char*)malloc( MAX_BUF_SIZE );    mFileBufSz = MAX_BUF_SIZE;    FILE* fp = fopen( fname, "rt" );    if ( !fp ) return NULL;    int sz = fread( mpFileBuf, 1, mFileBufSz, fp );    return Parse( mpFileBuf, mpFileBuf + sz );}void SourceParserBase::SetPlugin( SourceParserPlugin* pPlugin ){    if ( mpPlugin ) delete mpPlugin;    mpPlugin = pPlugin;}// ===========================================================================// debug methods// ===========================================================================#ifdef __WXDEBUG__void spContext::Dump(const wxString& indent) const{    DumpThis(indent);    // increase it for the children    wxString indentChild = indent + "    ";    for ( MMemberListT::const_iterator i = mMembers.begin();          i != mMembers.end();          i++ ) {        (*i)->Dump(indentChild);    }}void spContext::DumpThis(const wxString& WXUNUSED(indent)) const{    wxFAIL_MSG("abstract base class can't be found in parser tree!");}void spParameter::DumpThis(const wxString& indent) const{    wxLogDebug("%sparam named '%s' of type '%s'",               indent.c_str(), m_Name.c_str(), m_Type.c_str());}void spAttribute::DumpThis(const wxString& indent) const{    wxLogDebug("%svariable named '%s' of type '%s'",               indent.c_str(), m_Name.c_str(), m_Type.c_str());}void spOperation::DumpThis(const wxString& indent) const{    wxString protection;    if ( !mScope.empty() ) {        switch ( mVisibility ) {            case SP_VIS_PUBLIC:                protection = "public";                break;            case SP_VIS_PROTECTED:                protection = "protected";                break;            case SP_VIS_PRIVATE:                protection = "private";                break;            default:                wxFAIL_MSG("unknown protection type");        }    }    else {        protection = "global";    }    wxString constStr,virtualStr;    if(mIsConstant) constStr = _T("const ");    if(mIsVirtual) virtualStr = _T("virtual ");    wxLogDebug("%s%s%s%s function named '%s::%s' of type '%s'",               indent.c_str(),               constStr.c_str(),               virtualStr.c_str(),               protection.c_str(),               mScope.c_str(), m_Name.c_str(), m_RetType.c_str());}void spPreprocessorLine::DumpThis(const wxString& indent) const{    wxString kind;    switch ( mDefType ) {        case SP_PREP_DEF_DEFINE_SYMBOL:            kind = "define";            break;        case SP_PREP_DEF_REDEFINE_SYMBOL:            kind = "redefine";            break;        case SP_PREP_DEF_INCLUDE_FILE:            kind.Printf("include (%s)", CPP_GetIncludedFileNeme().c_str());            break;        case SP_PREP_DEF_OTHER:            kind = "other";            break;    }    wxLogDebug("%spreprocessor statement: %s",               indent.c_str(), kind.c_str());}void spClass::DumpThis(const wxString& indent) const{    wxString base;    for ( StrListT::const_iterator i = m_SuperClassNames.begin();          i != m_SuperClassNames.end();          i++ ) {        if ( !base.empty() )            base += ", ";        base += *i;    }    if ( !base )        base = "none";    wxString kind;    switch ( mClassSubType ) {        case SP_CLTYPE_CLASS:            kind = "class";            break;        case SP_CLTYPE_TEMPLATE_CLASS:            kind = "template class";            break;        case SP_CLTYPE_STRUCTURE:            kind = "struc";            break;        case SP_CLTYPE_UNION:            kind = "union";            break;        case SP_CLTYPE_INTERFACE:            kind = "interface";            break;        default:            wxFAIL_MSG("unknown class subtype");    }    wxLogDebug("%s%s named '%s' (base classes: %s)",               indent.c_str(), kind.c_str(),               m_Name.c_str(), base.c_str());}void spEnumeration::DumpThis(const wxString& indent) const{    wxLogDebug("%senum named '%s'",               indent.c_str(), m_Name.c_str());}void spTypeDef::DumpThis(const wxString& indent) const{    wxLogDebug("%stypedef %s = %s",               indent.c_str(), m_Name.c_str(), m_OriginalType.c_str());}void spFile::DumpThis(const wxString& indent) const{    wxLogDebug("%sfile '%s'",               indent.c_str(), m_FileName.c_str());}#endif // __WXDEBUG__

⌨️ 快捷键说明

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