dbgmain.c

来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 471 行

C
471
字号
/****************************************************************************
*
*                            Open Watcom Project
*
*    Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
*
*  ========================================================================
*
*    This file contains Original Code and/or Modifications of Original
*    Code as defined in and that are subject to the Sybase Open Watcom
*    Public License version 1.0 (the 'License'). You may not use this file
*    except in compliance with the License. BY USING THIS FILE YOU AGREE TO
*    ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
*    provided with the Original Code and Modifications, and is also
*    available at www.sybase.com/developer/opensource.
*
*    The Original Code and all software distributed under the License are
*    distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
*    EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
*    ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
*    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
*    NON-INFRINGEMENT. Please see the License for the specific language
*    governing rights and limitations under the License.
*
*  ========================================================================
*
* Description:  Debugger mainline.
*
****************************************************************************/


#include "dbgdefn.h"
#include "dbgtoken.h"
#include "dbgerr.h"
#include "dbgtoggl.h"
#include "dbginp.h"
#include "dbginfo.h"
#include "dbgreg.h"
#include "dbglit.h"
#include "spawn.h"
#include "dui.h"
#include <string.h>


// This list of extern functions is in alphabetic order.:
extern cmd_list         *AllocCmdList( char *,unsigned int );
extern void             ClearInpStack( input_type  );
extern void             FingClose( void );
extern void             FingFront( void );
extern void             FingOpen( void );
extern void             FiniAboutMessage( void );
extern void             FiniBrowse( void );
extern void             FiniCall( void );
extern void             FiniCmd( void );
extern void             FiniDLLList( void );
extern void             FiniDbgInfo( void );
extern void             FiniFont( void );
extern void             FiniGadget( void );
extern void             FiniHook( void );
extern void             FiniIOWindow( void );
extern void             FiniLiterals( void );
extern void             FiniLocalInfo( void );
extern void             FiniLook( void );
extern void             FiniMADInfo( void );
extern void             FiniMachState( void );
extern void             FiniMacros( void );
extern void             FiniMemWindow( void );
extern void             FiniMenus( void );
extern void             FiniPaint( void );
extern void             FiniScan( void );
extern void             FiniScreen( void );
extern void             FiniSource( void );
extern void             FiniToolBar( void );
extern void             FiniTrace( void );
extern void             FiniTrap( void );
extern char             *Format( char *,char *,... );
extern void             FreeCmdList( cmd_list * );
extern void             FreezeInpStack( void );
extern char             *GetCmdEntry( char *tab, int index, char *buff );
extern void             GrabHandlers( void );
extern void             InitAboutMessage( void );
extern void             InitBPs( void );
extern void             InitBrowse( void );
extern bool             InitCmd( void );
extern void             InitDLLList( void );
extern void             InitDbgInfo( void );
extern void             InitFont( void );
extern void             InitGadget( void );
extern void             InitHelp( void );
extern void             InitHook( void );
extern void             InitIOWindow( void );
extern void             InitLiterals( void );
extern void             InitLocalInfo( void );
extern void             InitLook( void );
extern void             InitMADInfo( void );
extern void             InitMachState( void );
extern void             InitMemWindow( void );
extern void             InitMenus( void );
extern void             InitPaint( void );
extern void             InitScan( void );
extern void             InitScreen( void );
extern void             InitSource( void );
extern void             InitToolBar( void );
extern void             InitTrap( char * );
extern void             LangSetFini( void );
extern bool             LangSetInit( void );
extern void             LoadProg( void );
extern void             LogFini( void );
extern void             LogInit( void );
extern void             PathFini( void );
extern void             PathInit( void );
extern void             PointFini( void );
extern void             PopInpStack( void );
extern void             PredefFini( void );
extern void             PredefInit( void );
extern void             ProcAccel( void );
extern void             ProcBreak( void );
extern void             ProcCall( void );
extern void             ProcCapture( void );
extern void             ProcCmd( void );
extern void             ProcDisplay( void );
extern void             ProcDo( void );
extern void             ProcError( void );
extern void             ProcExamine( void );
extern void             ProcFlip( void );
extern void             ProcFont( void );
extern void             ProcGo( void );
extern void             ProcHelp( void );
extern void             ProcHook( void );
extern void             ProcIf( void );
extern void             ProcInput( void );
extern void             ProcInvoke( void );
extern void             ProcLog( void );
extern void             ProcNew( void );
extern void             ProcPaint( void );
extern void             ProcPrint( void );
extern void             ProcQuit( void );
extern void             ProcRegister( void );
extern void             ProcRemark( void );
extern void             ProcSet( void );
extern void             ProcShow( void );
extern void             ProcSystem( void );
extern void             ProcThread( void );
extern void             ProcTrace( void );
extern void             ProcView( void );
extern void             ProcWhile( void );
extern void             ProcWindow( void );
extern void             ProfileInvoke( char * );
extern bool             PurgeInpStack( void );
extern void             PushCmdList( cmd_list *cmds );
extern void             RecordFini( void );
extern void             RecordInit( void );
extern void             ReleaseProgOvlay( bool );
extern char             *ReScan( char * );
extern void             RestoreHandlers( void );
extern void             Ring( void );
extern void             Scan( void );
extern unsigned int     ScanCmd( char * );
extern unsigned int     ScanLen( void );
extern char             *ScanPos( void );
extern void             StartupErr( char * );
extern void             Suicide( void );
extern void             SupportFini( void );
extern void             SymCompFini( void );
extern void             SysFileInit( void );
extern bool             TBreak( void );
extern void             VarDisplayFini( void );
extern void             VarDisplayInit( void );
extern void             WndDlgFini( void );
extern void             WndMemInit( void );

extern char             *InitCmdList;
extern char             *TrpFile;
extern char             *CmdStart;
extern char             *NameBuff;
extern char             *TxtBuff;
extern tokens           CurrToken;
extern unsigned char    DefRadix;
extern unsigned char    CurrRadix;
extern debug_level      DbgLevel;
extern debug_level      ActiveWindowLevel;
extern char             DbgBuffers[];
extern int              ScanSavePtr;
extern address          NilAddr;
extern char             *InvokeFile;

OVL_EXTERN void         ProcNil( void );




#define pick( a, b, c ) extern void b( void );
#include "dbgcmd.h"

static char CmdNameTab[] = {
    #define pick( a, b, c ) c
    #include "dbgcmd.h"
};



static void (* const CmdJmpTab[])( void ) = {
    &ProcNil,
    #define pick( a, b, c ) &b,
    #include "dbgcmd.h"
};


char *GetCmdName( int index )
{
    static char buff[ MAX_CMD_NAME+1 ];
    GetCmdEntry( CmdNameTab, index, buff );
    return( buff );
}


/*
 * DebugInit -- mainline for initialization
 */

void DebugInit( void )
{
    _SwitchOn( SW_ERROR_STARTUP );
    _SwitchOn( SW_CHECK_SOURCE_EXISTS );
    SET_NIL_ADDR( NilAddr );
    TxtBuff  = &DbgBuffers[0];
    NameBuff = &DbgBuffers[TXT_LEN+1];
    CurrRadix = DefRadix = 10;
    DbgLevel = MIX;
    ActiveWindowLevel = MIX;
    _SwitchOn( SW_BELL );
    _SwitchOn( SW_FLIP );
    _SwitchOn( SW_RECURSE_CHECK );
    _SwitchOff( SW_ADDING_SYMFILE );
    _SwitchOff( SW_TASK_RUNNING );
    RecordInit();
    LogInit();
    InitMADInfo();
    InitMachState();
    PathInit();
    InitDbgInfo();
    InitTrap( TrpFile );
    if( !LangSetInit() ) {
        FiniTrap();
        StartupErr( LIT( STARTUP_Loading_PRS ) );
    }
    if( !InitCmd() ) {
        FiniTrap();
        StartupErr( LIT( ERR_NO_MEMORY ) );
    }
    InitScan();
    InitLook();
    InitBPs();
    InitSource();
    InitDLLList();
    InitScreen();
    DUIInit();
    InitHook();
    VarDisplayInit();
}

/*
 * ProcNil -- process NIL command
 */

OVL_EXTERN void ProcNil( void )
{
    if( ScanLen() == 0 ) Scan();
    Error( ERR_NONE, LIT( ERR_BAD_COMMAND ), ScanPos(), ScanLen() );
}


/*
 *
 */

void ReportTask( task_status task, unsigned code )
{
    switch( task ) {
    case TASK_NEW:
        _SwitchOn( SW_HAVE_TASK );
        DUIStatusText( LIT( New_Task ) );
        DUIDlgTxt( LIT( New_Task ) );
        break;
    case TASK_NOT_LOADED:
        _SwitchOff( SW_HAVE_TASK );
        Format( TxtBuff, LIT( Task_Not_Loaded ), code );
        DUIMsgBox( TxtBuff );
        Ring(); Ring();
        break;
    case TASK_NONE:
        _SwitchOff( SW_HAVE_TASK );
        DUIStatusText( LIT( No_Task ) );
        DUIDlgTxt( LIT( No_Task ) );
        break;
    }
}


/*
 * ChkBreak -- report an error if there is a pending user interrupt
 */

void ChkBreak( void )
{
    if( TBreak() ) Error( ERR_NONE, LIT( ERR_DBG_INTERRUPT ) );
}


/*
 * ProcACmd -- process a command
 */


void ProcACmd( void )
{
    unsigned cmd;

    ChkBreak();
    CmdStart = ScanPos();
    switch( CurrToken ) {
    case T_CMD_SEPARATOR:
        Scan();
        break;
    case T_DIV:
        Scan();
        ProcDo();
        break;
    case T_LT:
        Scan();
        ProcInvoke();
        break;
    case T_GT:
        Scan();
        ProcLog();
        break;
    case T_QUESTION:
        Scan();
        ProcPrint();
        break;
    case T_MUL:
        Scan();
        ProcRemark();
        break;
    case T_EXCLAMATION:
        Scan();
        ProcSystem();
        break;
    case T_TILDE:
        Scan();
        ProcThread();
        break;
    default:
        cmd = ScanCmd( CmdNameTab );
        if( cmd == 0 && _IsOn( SW_IMPLICIT ) ) {
            ProcInvoke();
        } else {
            (*CmdJmpTab[ cmd ])();
        }
        break;
    }
    ScanSavePtr = 0; /* clean up previous ScanSave locations */
}


OVL_EXTERN void Profile( void )
{
    if( InvokeFile != NULL ) {
        ProfileInvoke( InvokeFile );
        _Free( InvokeFile );
        InvokeFile = NULL;
        ProcInput();
    }
}

static void PushInitCmdList( void )
{
    cmd_list    *cmds;

    if( InitCmdList != NULL ) {
        cmds = AllocCmdList( InitCmdList, strlen( InitCmdList ) );
        _Free( InitCmdList );
        InitCmdList = NULL;
        PushCmdList( cmds );
        FreeCmdList( cmds );
    }
}

/*
 * DebugMain -- mainline for initialization
 */


void DebugMain( void )
{
    bool        save;

    GrabHandlers();
    SysFileInit();
    WndMemInit();
    InitLiterals();
    InitLocalInfo();
    ProcCmd();

    Spawn( &DebugInit );
    FingOpen();
    DUIFreshAll();

    LoadProg();

    save = DUIStopRefresh( TRUE );
    FreezeInpStack();
    _SwitchOn( SW_RUNNING_PROFILE );
    Spawn( &Profile );          /* run profile command file */
    _SwitchOff( SW_RUNNING_PROFILE );
    PushInitCmdList();
    DUIStopRefresh( save );
    FingClose();
    DUIShow();
}



/*
 * DebugExit -- end the debugger (Kill! Crush! Destroy!)
 */

void DebugExit( void )
{
    if( DUIClose() ) {
        Suicide();
    }
}


void DebugFini( void )
{
    PointFini();
#if !(defined(__GUI__) && defined(__OS2__))
    ReleaseProgOvlay( TRUE ); // see dlgfile.c
#endif
    VarDisplayFini();
    FiniHook();
    FiniCmd();
    LogFini();
    while( !PurgeInpStack() ) {
        ClearInpStack( INP_STOP_PURGE );
    }
    LangSetFini();
    SupportFini();
    FiniTrap();
    RecordFini();
    FiniMachState();
    FiniDbgInfo();
    FiniScan();
    FiniLook();
    FiniDLLList();
    FiniSource();
    FiniCall();
    PathFini();
    DUIFini();
    SymCompFini();
    FiniScreen();
    FiniMADInfo();
    FiniTrace();
    RestoreHandlers();
    _Free( TrpFile );
    FiniLiterals();
    FiniLocalInfo();
}

⌨️ 快捷键说明

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