dbgset.c

来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 1,059 行 · 第 1/2 页

C
1,059
字号
/****************************************************************************
*
*                            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:  WHEN YOU FIGURE OUT WHAT THIS FILE DOES, PLEASE
*               DESCRIBE IT HERE!
*
****************************************************************************/


#include <string.h>
#include <ctype.h>
#include "dbgdefn.h"
#include "dbgtoken.h"
#include "dbgerr.h"
#include "dbgtoggl.h"
#include "dbglit.h"
#include "dbgmem.h"
#include "dbginfo.h"
#include "dbgio.h"
#include "mad.h"
#include "madcli.h"


extern unsigned int     ScanCmd( char * );
extern void             Scan( void );
extern char             *ScanPos( void );
extern char             *ReScan( char * );
extern bool             ScanEOC( void );
extern bool             ScanItem( bool, char **, unsigned int * );
extern void             ReqEOC( void );
extern unsigned         SetCurrRadix( unsigned int );
extern char             *GetCmdEntry( char *, int, char * );
extern char             *CnvULongDec( unsigned long, char * );
extern unsigned         ReqExpr( void );
extern unsigned         OptExpr( void );
extern void             WndUserAdd( char *, unsigned int );
extern void             CallSet( void );
extern void             ImplicitSet( void );
extern void             LookSet( void );
extern void             RadixSet( void );
extern void             SourceSet( void );
extern void             LevelSet( void );
extern void             CallConf( void );
extern void             ImplicitConf( void );
extern void             LookConf( void );
extern void             RadixConf( void );
extern void             SourceConf( void );
extern void             LevelConf( void );
extern void             DoConfig( char *,char *,void (**)(), void (**)() );
extern void             ConfigLine( char * );
extern void             WndMenuOn( void );
extern void             WndMenuOff( void );
extern void             LangInit( void );
extern void             LangFini( void );
extern bool             LangLoad( char *, int );
extern char             *StrCopy( char *, char * );
extern cmd_list         *AllocCmdList( char *, unsigned int );
extern void             FreeCmdList( cmd_list * );
extern char             *Format( char *, char *, ... );
extern void             Recog( unsigned int );
extern void             VarChangeOptions( void );
extern void             RegChangeOptions( void );
extern void             FPUChangeOptions( void );
extern void             MMXChangeOptions( void );
extern void             XMMChangeOptions( void );
extern void             AsmChangeOptions( void );
extern void             FuncChangeOptions( void );
extern void             GlobChangeOptions( void );
extern void             ModChangeOptions( void );
extern void             ConfigCmdList( char *cmds, int indent );
extern void             WndDlgTxt( char * );
extern char             *UniqStrAddr( address *addr, char *p ,unsigned);
extern char             *GetCmdName( int );
extern void             RegFindData( mad_type_kind kind, mad_reg_set_data const **pdata );
extern mad_handle       FindMAD( char *, unsigned );
extern unsigned         QualifiedSymName( sym_handle *sh, char *name, unsigned max, bool uniq );
extern void             AddrFloat( address * );
unsigned                GetMADNormalizedString( mad_string, unsigned, char * );

extern char             OnOffNameTab[];
extern char             *TxtBuff;
extern char             *Language;
extern char             WndNameTab[];
extern tokens           CurrToken;
extern margins          SrcMar;
extern margins          AsmMar;
extern system_config    SysConfig;

static char_ring        *SupportRtns;

typedef struct pending_toggle_list      pending_toggle_list;

struct pending_toggle_list {
    pending_toggle_list *next;
    mad_handle          mad;
    char                toggle[1]; /* variable sized */
};

typedef enum {
    MWT_ASM,
    MWT_REG,
    MWT_FPU,
    MWT_MMX,
    MWT_XMM,
    MWT_LAST
} mad_window_toggles;

static pending_toggle_list *PendToggleList[MWT_LAST];

static char SetNameTab[] = {
    "AUtosave\0"
    "ASsembly\0"
    "Variable\0"
    "FUnctions\0"
    "GLobals\0"
    "MOdules\0"
    "REGister\0"
    "Fpu\0"
    "MMx\0"
    "XMm\0"
    "Bell\0"
    "Call\0"
    "Dclick\0"
    "Implicit\0"
    "INput\0"
    "Radix\0"
    "RECursion\0"
    "SEarch\0"
    "SOurce\0"
    "SYmbol\0"
    "TAb\0"
    "TYpes\0"
    "Level\0"
    "LAnguage\0"
    "MAcro\0"
    "SUpportroutine\0"
};

static void     AutoConf( void );
static void     AsmConf( void );
static void     VarConf( void );
static void     FuncConf( void );
static void     GlobConf( void );
static void     ModConf( void );
static void     RegConf( void );
static void     FPUConf( void );
static void     MMXConf( void );
static void     XMMConf( void );
extern void     DClickConf( void );
extern void     TabConf( void );
extern void     TypeConf( void );
extern void     InputConf( void );
extern void     MacroConf( void );
static void     BellConf( void );
extern void     SearchConf( void );
static void     LangConf( void );
static void     RecursionConf( void );
static void     SupportConf( void );

static void     BadSet( void );
static void     AutoSet( void );
static void     AsmSet( void );
static void     VarSet( void );
static void     FuncSet( void );
static void     GlobSet( void );
static void     ModSet( void );
static void     RegSet( void );
static void     FPUSet( void );
static void     MMXSet( void );
static void     XMMSet( void );
extern void     DClickSet( void );
static void     BellSet( void );
extern void     TabSet( void );
extern void     TypeSet( void );
static void     LangSet( void );
extern void     InputSet( void );
extern void     MacroSet( void );
extern void     SearchSet( void );
static void     RecursionSet( void );
static void     SupportSet( void );

static void (* const SetJmpTab[])( void ) = {
    &BadSet,
    &AutoSet,
    &AsmSet,
    &VarSet,
    &FuncSet,
    &GlobSet,
    &ModSet,
    &RegSet,
    &FPUSet,
    &MMXSet,
    &XMMSet,
    &BellSet,
    &CallSet,
    &DClickSet,
    &ImplicitSet,
    &InputSet,
    &RadixSet,
    &RecursionSet,
    &SearchSet,
    &SourceSet,
    &LookSet,
    &TabSet,
    &TypeSet,
    &LevelSet,
    &LangSet,
    &MacroSet,
    &SupportSet,
};

static void (* SetConfJmpTab[])( void ) = {
    &AutoConf,
    &AsmConf,
    &VarConf,
    &FuncConf,
    &GlobConf,
    &ModConf,
    &RegConf,
    &FPUConf,
    &MMXConf,
    &XMMConf,
    &BellConf,
    &CallConf,
    &DClickConf,
    &ImplicitConf,
    &InputConf,
    &RadixConf,
    &RecursionConf,
    &SearchConf,
    &SourceConf,
    &LookConf,
    &TabConf,
    &TypeConf,
    &LevelConf,
    &LangConf,
    &MacroConf,
    &SupportConf,
    NULL,
};


static void (* SetNotAllTab[])( void ) =
{
    &CallConf,
    &LevelConf,
    &LangConf,
    &InputConf,
    NULL,
};




bool SwitchOnOff( void )
{
    unsigned which;

    which = ScanCmd( OnOffNameTab );
    if( which == 0 ) Error( ERR_LOC, LIT( ERR_WANT_ON_OFF ) );
    ReqEOC();
    return( which == 1 );
}


void ShowSwitch( bool on )
{
    GetCmdEntry( OnOffNameTab, on ? 1 : 2, TxtBuff );
    ConfigLine( TxtBuff );
}


static void BadSet( void )
{
    Error( ERR_LOC, LIT( ERR_BAD_SUBCOMMAND ), GetCmdName( CMD_SET ) );
}


/*
 * ProcSet -- process set command
 */


void ProcSet( void )
{
    (*SetJmpTab[ ScanCmd( SetNameTab ) ])();
}


void ConfigSet( void )
{
    DoConfig( GetCmdName( CMD_SET ), SetNameTab, SetConfJmpTab, SetNotAllTab );
}


/*
 * BellSet - set bell on/off processing
 */

static void BellSet( void )
{
    _SwitchSet( SW_BELL, SwitchOnOff() );
}

static void BellConf( void )
{
    ShowSwitch( _IsOn( SW_BELL ) );
}


/*
 * AutoSet - set autoconfig on/off processing
 */

static void AutoSet( void )
{
    _SwitchSet( SW_AUTO_SAVE_CONFIG, SwitchOnOff() );
}

static void AutoConf( void )
{
    ShowSwitch( _IsOn( SW_AUTO_SAVE_CONFIG ) );
}


/*
 * RecursionSet - set recursion checking on/off processing
 */

static void RecursionSet( void )
{
    _SwitchSet( SW_RECURSE_CHECK, SwitchOnOff() );
}

static void RecursionConf( void )
{
    ShowSwitch( _IsOn( SW_RECURSE_CHECK ) );
}


bool LangSetInit( void )
{
    static char InitialLang[] = { "cpp" };

    LangInit();
    _Alloc( Language, sizeof( InitialLang ) + 1 );
    if( Language == NULL ) return( FALSE );
    StrCopy( InitialLang, Language );
    return( LangLoad( Language, strlen( Language ) ) );
}

void LangSetFini( void )
{
    _Free( Language );
    LangFini();
}




/*
 * NewLang -- load a new expression language, if different from current one
 */

void NewLang( char *lang )
{
    char       *new;
    unsigned    len;

    if( lang == NULL ) return;
    strlwr( lang );
    len = strlen( lang );
    if( (len != strlen( Language )) || memcmp( lang, Language, len ) != 0 ) {
        new = DbgMustAlloc( len + 1 );
        memcpy( new, lang, len );
        new[ len ] = NULLCHAR;
        if( !LangLoad( new, len ) ) {
            LangLoad( Language, strlen( Language ) );
            _Free( new );
            Error( ERR_NONE, LIT( ERR_NO_LANG ) );
        }
        _Free( Language );
        Language = new;
    }
}


static void LangSet( void )
{
    char        *start;
    unsigned    len;

    ScanItem( TRUE, &start, &len );
    ReqEOC();
    NewLang( start );
}

static void LangConf( void )
{
    ConfigLine( Language );
}


/*
        Individual Window Settings
*/
#define ONCE_FOR_ALL_SWITCHES \
    once( SW_ASM_SOURCE ) \
    once( SW_ASM_HEX ) \
    once( SW_VAR_WHOLE_EXPR ) \
    once( SW_VAR_SHOW_CODE ) \
    once( SW_VAR_SHOW_INHERIT ) \
    once( SW_VAR_SHOW_COMPILER ) \
    once( SW_VAR_SHOW_MEMBERS ) \
    once( SW_VAR_SHOW_PRIVATE ) \
    once( SW_VAR_SHOW_PROTECTED ) \
    once( SW_VAR_SHOW_STATIC ) \
    once( SW_FUNC_D2_ONLY ) \
    once( SW_GLOB_D2_ONLY ) \
    once( SW_MOD_ALL_MODULES )

enum {
    #define once( x ) x,
    ONCE_FOR_ALL_SWITCHES
    #undef once
};

typedef struct window_toggle {
    char        on;
    char        off;
    char        sw;
} window_toggle;

enum {
    ON,
    OFF
};


static void SwitchTwiddle( int which, int on )
{
    switch( which ) {
    #define once( x ) \
    case x: \
        _SwitchSet( x, on ); \
        break;
    ONCE_FOR_ALL_SWITCHES
    #undef once
    }
}

static int SwitchIsOn( int which )
{
    switch( which ) {
    #define once( x ) \
    case x: \
        return( _IsOn( x ) ); \
        break;
    ONCE_FOR_ALL_SWITCHES
    #undef once
    }
    return( 0 );
}

static const mad_toggle_strings *GetMADToggleList( const mad_reg_set_data *rsd )
{
    if( rsd == NULL ) return( MADDisasmToggleList() );
    return( MADRegSetDisplayToggleList( rsd ) );
}

static unsigned DoMADToggle( const mad_reg_set_data *rsd, unsigned on, unsigned off )
{
    if( rsd == NULL ) return( MADDisasmToggle( on, off ) );
    return( MADRegSetDisplayToggle( rsd, on, off ) );
}

static void PendingAdd( mad_window_toggles wt, mad_handle mh,
                        char *name, unsigned len )
{
    pending_toggle_list **owner;
    pending_toggle_list *new;

    owner = &PendToggleList[wt];
    for( ;; ) {
        new = *owner;
        if( new == NULL ) break;
        owner = &new->next;
    }
    new = DbgMustAlloc( sizeof( *new ) + len );
    *owner = new;
    new->next = NULL;
    new->mad = mh;
    memcpy( new->toggle, name, len );
    new->toggle[len] = '\0';
}


static bool DoOneToggle( mad_window_toggles wt )
{
    unsigned                    bit;
    char                        *start;
    unsigned                    len;
    const mad_toggle_strings    *toggles;
    const mad_reg_set_data      *rsd;

    if( !ScanItem( TRUE, &start, &len ) ) return( FALSE );
    switch( wt ) {

⌨️ 快捷键说明

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