dbgset.c

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

C
1,059
字号
    case MWT_ASM:
        rsd = NULL;
        break;
    case MWT_FPU:
        RegFindData( MTK_FLOAT, &rsd );
        if( rsd == NULL ) {
            PendingAdd( SysConfig.mad, wt, start, len );
            return( TRUE );
        }
        break;
    case MWT_REG:
        RegFindData( MTK_INTEGER, &rsd );
        if( rsd == NULL ) {
            PendingAdd( SysConfig.mad, wt, start, len );
            return( TRUE );
        }
        break;
    case MWT_MMX:
        RegFindData( MTK_CUSTOM, &rsd );
        if( rsd == NULL ) {
            PendingAdd( SysConfig.mad, wt, start, len );
            return( TRUE );
        }
        break;
    case MWT_XMM:
        RegFindData( MTK_XMM, &rsd );
        if( rsd == NULL ) {
            PendingAdd( SysConfig.mad, wt, start, len );
            return( TRUE );
        }
        break;
    }
    bit = 1;
    toggles = GetMADToggleList( rsd );
    for( ;; ) {
        if( toggles->on == MSTR_NIL ) return( FALSE );
        GetMADNormalizedString( toggles->on, TXT_LEN, TxtBuff );
        if( TxtBuff[0] != NULLCHAR && strnicmp( start, TxtBuff, len ) == 0 ) {
            DoMADToggle( rsd, bit, 0 );
            break;
        }
        GetMADNormalizedString( toggles->off, TXT_LEN, TxtBuff );
        if( TxtBuff[0] != NULLCHAR && strnicmp( start, TxtBuff, len ) == 0 ) {
            DoMADToggle( rsd, 0, bit );
            break;
        }
        bit <<= 1;
        ++toggles;
    }
    return( TRUE );
}

void PendingToggles( void )
{
    mad_window_toggles          wt;
    pending_toggle_list         **owner;
    pending_toggle_list         *curr;
    char                        *scan;

    scan = ScanPos();
    for( wt = 0; wt < MWT_LAST; ++wt ) {
        owner = &PendToggleList[wt];
        for( ;; ) {
            curr = *owner;
            if( curr == NULL ) break;
            if( curr->mad == SysConfig.mad ) {
                ReScan( curr->toggle );
                DoOneToggle( wt );
                *owner = curr->next;
                _Free( curr );
            } else {
                owner = &curr->next;
            }
        }
    }
    ReScan( scan );
}

static bool OneToggle( mad_window_toggles wt )
{
    char                *name;
    unsigned            len;
    mad_handle          old_mad;
    mad_handle          new_mad;
    char                *scan;
    bool                res;


    scan = ScanPos();
    if( DoOneToggle( wt ) ) return( TRUE );
    ReScan( scan );
    if( !ScanItem( TRUE, &name, &len ) ) return( FALSE );
    scan = name;
    for( ;; ) {
        if( scan > &name[len] ) break;
        if( *scan == '/' ) {
            len = scan - name;
            ReScan( scan );
            break;
        }
        ++scan;
    }
    if( CurrToken != T_DIV ) return( FALSE );
    Scan();
    new_mad = FindMAD( name, len );
    if( new_mad == MAD_NIL ) return( FALSE );
    if( MADLoaded( new_mad ) != MS_OK ) {
        /* put the toggle on the pending list */
        if( !ScanItem( TRUE, &name, &len ) ) return( FALSE );
        PendingAdd( wt, new_mad, name, len );
        return( TRUE );
    }
    old_mad = MADActiveSet( new_mad );
    res = DoOneToggle( wt );
    MADActiveSet( old_mad );
    return( res );
}

static void ToggleWindowSwitches( window_toggle *toggle, int len,
                                char *settings, mad_window_toggles wt )
{
    int idx;
    int i;

    while( !ScanEOC() ) {
        if( settings != NULL ) {
            idx = ScanCmd( settings );
            for( i = 0; i < len; ++i ) {
                if( toggle[ i ].on == idx ) {
                    SwitchTwiddle( toggle[ i ].sw, 1 );
                    break;
                }
                if( toggle[ i ].off == idx ) {
                    SwitchTwiddle( toggle[ i ].sw, 0 );
                    break;
                }
            }
        }
        if( i == len || settings == NULL ) {
            if( wt >= MWT_LAST || !OneToggle( wt ) ) {
                Error( ERR_LOC, LIT( ERR_BAD_SUBCOMMAND ), GetCmdName( CMD_SET ) );
            }
        }
    }
}

static char *DumpAToggle( char *p, mad_handle mh, char *toggle )
{
    if( toggle[0] != NULLCHAR ) {
        MADNameDescription( mh, TXT_LEN - (p-TxtBuff), p );
        for( ;; ) {
            if( *p == '\0' ) break;
            if( *p == ' ' ) break;
            ++p;
        }
        *p++ = '/';
        p = StrCopy( toggle, p );
        *p++ = ' ';
    }
    return( p );
}

struct dump_toggles {
    mad_window_toggles          wt;
    char                        *p;
};

static walk_result DumpToggles( mad_handle mh, void *d )
{
    struct dump_toggles         *td = d;
    const mad_toggle_strings    *toggles;
    unsigned                    bit;
    char                        buff[80];
    const mad_reg_set_data      *rsd;

    if( MADLoaded( mh ) != MS_OK ) return( WR_CONTINUE );
    switch( td->wt ) {
    case MWT_FPU:
        RegFindData( MTK_FLOAT, &rsd );
        if( rsd == NULL ) return( WR_CONTINUE );
        break;
    case MWT_REG:
        RegFindData( MTK_INTEGER, &rsd );
        if( rsd == NULL ) return( WR_CONTINUE );
        break;
    case MWT_MMX:
        RegFindData( MTK_CUSTOM, &rsd );
        if( rsd == NULL ) return( WR_CONTINUE );
        break;
    case MWT_XMM:
        RegFindData( MTK_XMM, &rsd );
        if( rsd == NULL ) return( WR_CONTINUE );
        break;
    default:
        rsd = NULL;
        break;
    }
    bit = DoMADToggle( rsd, 0, 0 );
    toggles = GetMADToggleList( rsd );
    while( toggles->menu != MSTR_NIL ) {
        if( bit & 1 ) {
            GetMADNormalizedString( toggles->on, sizeof( buff ), buff );
        } else {
            GetMADNormalizedString( toggles->off, sizeof( buff ), buff );
        }
        td->p = DumpAToggle( td->p, mh, buff );
        bit >>= 1;
        ++toggles;
    }
    return( WR_CONTINUE );
}

static void ConfWindowSwitches( window_toggle *toggle, int len, char *settings,
                        mad_window_toggles wt )
{
    struct dump_toggles data;
    pending_toggle_list *curr;
    char                *ptr;
    int                 i;

    ptr = TxtBuff;
    for( i = 0; i < len; ++i ) {
        ptr = GetCmdEntry( settings,
                           SwitchIsOn( toggle[ i ].sw ) ?
                               toggle[ i ].on :
                               toggle[ i ].off,
                           ptr );
        *ptr++= ' ';
    }
    if( wt < MWT_LAST ) {
        data.wt = wt;
        data.p = ptr;
        MADWalk( DumpToggles, &data );
        ptr = data.p;
        for( curr = PendToggleList[wt]; curr != NULL; curr = curr->next ) {
            ptr = DumpAToggle( ptr, curr->mad, curr->toggle );
        }
    }
    *ptr = '\0';
    ConfigLine( TxtBuff );
}


/*
        Assembly window
*/

static char AsmSettings[] = {
    "Source\0"
    "NOSource\0"
    "Hexadecimal\0"
    "Decimal\0"
};

enum {
    ASM_SOURCE = 1,
    ASM_NOSOURCE,
    ASM_HEX,
    ASM_DECIMAL,
};

static window_toggle    AsmToggle[] = {
    { ASM_SOURCE, ASM_NOSOURCE, SW_ASM_SOURCE },
    { ASM_HEX, ASM_DECIMAL, SW_ASM_HEX },
};

static void AsmSet( void )
{
    ToggleWindowSwitches( AsmToggle, ArraySize( AsmToggle ), AsmSettings, MWT_ASM );
    AsmChangeOptions();
}

static void AsmConf( void )
{
    ConfWindowSwitches( AsmToggle, ArraySize( AsmToggle ), AsmSettings, MWT_ASM );
}

/*
        FPU Window
*/

static void FPUSet( void )
{
    ToggleWindowSwitches( NULL, 0, NULL, MWT_FPU );
    FPUChangeOptions();
}

static void FPUConf( void )
{
    ConfWindowSwitches( NULL, 0, NULL, MWT_FPU );
}

/*
        Variables window
*/

static char VarSettings[] = {
    "Entire\0"
    "Partial\0"
    "CODe\0"
    "NOCODe\0"
    "INherit\0"
    "NOINherit\0"
    "COMpiler\0"
    "NOCOMpiler\0"
    "PRIvate\0"
    "NOPRIvate\0"
    "PROtected\0"
    "NOPROTected\0"
    "STatic\0"
    "NOSTatic\0"
    "Members\0"
    "NOMembers\0"
};

enum {
    VAR_ENTIRE = 1,
    VAR_PARTIAL,
    VAR_CODE,
    VAR_NOCODE,
    VAR_INHERIT,
    VAR_NOINHERIT,
    VAR_COMPILER,
    VAR_NOCOMPILER,
    VAR_PRIVATE,
    VAR_NOPRIVATE,
    VAR_PROTECTED,
    VAR_NOPROTECTED,
    VAR_STATIC,
    VAR_NOSTATIC,
    VAR_MEMBERS,
    VAR_NOMEMBERS,
};

static window_toggle VarToggle[] = {
    { VAR_ENTIRE, VAR_PARTIAL, SW_VAR_WHOLE_EXPR },
    { VAR_CODE, VAR_NOCODE, SW_VAR_SHOW_CODE },
    { VAR_INHERIT, VAR_NOINHERIT, SW_VAR_SHOW_INHERIT },
    { VAR_COMPILER, VAR_NOCOMPILER, SW_VAR_SHOW_COMPILER },
    { VAR_MEMBERS, VAR_NOMEMBERS, SW_VAR_SHOW_MEMBERS },
    { VAR_PRIVATE, VAR_NOPRIVATE, SW_VAR_SHOW_PRIVATE },
    { VAR_PROTECTED, VAR_NOPROTECTED, SW_VAR_SHOW_PROTECTED },
    { VAR_STATIC, VAR_NOSTATIC, SW_VAR_SHOW_STATIC },
};

static void VarSet( void )
{
    ToggleWindowSwitches( VarToggle, ArraySize( VarToggle ), VarSettings, MWT_LAST );
    VarChangeOptions();
}

static void VarConf( void )
{
    ConfWindowSwitches( VarToggle, ArraySize( VarToggle ), VarSettings, MWT_LAST );
    ConfigLine( TxtBuff );
}


static char FuncSettings[] = {
    "Typed\0"
    "All\0"
};

enum {
    FUNC_TYPED = 1,
    FUNC_ALL,
};

static window_toggle FuncToggle[] = {
    { FUNC_TYPED, FUNC_ALL, SW_FUNC_D2_ONLY },
};

static void FuncSet( void )
{
    ToggleWindowSwitches( FuncToggle, ArraySize( FuncToggle ), FuncSettings, MWT_LAST );
    FuncChangeOptions();
}

static void FuncConf( void )
{
    ConfWindowSwitches( FuncToggle, ArraySize( FuncToggle ), FuncSettings, MWT_LAST );
}


static window_toggle GlobToggle[] = {
    { FUNC_TYPED, FUNC_ALL, SW_GLOB_D2_ONLY },
};

static void GlobSet( void )
{
    ToggleWindowSwitches( GlobToggle, ArraySize( GlobToggle ), FuncSettings, MWT_LAST );
    GlobChangeOptions();
}

static void GlobConf( void )
{
    ConfWindowSwitches( GlobToggle, ArraySize( GlobToggle ), FuncSettings, MWT_LAST );
}


static window_toggle ModToggle[] = {
    { FUNC_ALL, FUNC_TYPED, SW_MOD_ALL_MODULES },
};

static void ModSet( void )
{
    ToggleWindowSwitches( ModToggle, ArraySize( ModToggle ), FuncSettings, MWT_LAST );
    ModChangeOptions();
}

static void ModConf( void )
{
    ConfWindowSwitches( ModToggle, ArraySize( ModToggle ), FuncSettings, MWT_LAST );
}


static void RegSet( void )
{
    ToggleWindowSwitches( NULL, 0, NULL, MWT_REG );
    RegChangeOptions();
}

static void RegConf( void )
{
    ConfWindowSwitches( NULL, 0, NULL, MWT_REG );
}


static void MMXSet( void )
{
    ToggleWindowSwitches( NULL, 0, NULL, MWT_MMX );
    MMXChangeOptions();
}

static void MMXConf( void )
{
    ConfWindowSwitches( NULL, 0, NULL, MWT_MMX );
}


static void XMMSet( void )
{
    ToggleWindowSwitches( NULL, 0, NULL, MWT_XMM );
    XMMChangeOptions();
}

static void XMMConf( void )
{
    ConfWindowSwitches( NULL, 0, NULL, MWT_XMM );
}


void SupportFini( void )
{
    char_ring   *curr, *junk;

    curr = SupportRtns;
    while( curr != NULL ) {
        junk = curr;
        curr = curr->next;
        _Free( junk );
    }
    SupportRtns = NULL;
}


static void SupportSet( void )
{
    char_ring   *new;
    char        *start;
    unsigned    len;
    unsigned    count;

    count = 0;
    while( ScanItem( TRUE, &start, &len ) ) {
        new = DbgMustAlloc( sizeof( *new ) + len );
        new->next = SupportRtns;
        SupportRtns = new;
        memcpy( new->name, start, len );
        new->name[len] = '\0';
        ++count;
    }
    ReqEOC();
    if( count == 0 ) {
        SupportFini();
    }
}

static void SupportConf( void )
{
    char_ring   *curr;
    char        *p;

    p = TxtBuff;
    for( curr = SupportRtns; curr != NULL; curr = curr->next ) {
        p = StrCopy( "}", StrCopy( curr->name, StrCopy( "{", p ) ) );
        if( p - TxtBuff > 50 ) {
            ConfigLine( TxtBuff );
            p = TxtBuff;
        }
    }
    if( p != TxtBuff ) {
        ConfigLine( TxtBuff );
    }
}

static bool SupportName( char *name, char *pattern )
{
    for( ;; ) {
        if( *name == '\0' && *pattern == '\0' ) return( TRUE );
        if( *pattern == '*' ) return( TRUE );
        if( *name != *pattern ) return( FALSE );
        ++name;
        ++pattern;
    }
}

bool IsSupportRoutine( sym_handle *sym )
{
    char_ring                   *curr;
    char                        name[TXT_LEN];

    QualifiedSymName( sym, name, sizeof( name ), TRUE );
    for( curr = SupportRtns; curr != NULL; curr = curr->next ) {
        if( SupportName( name, curr->name ) ) return( TRUE );
    }
    return( FALSE );
}

⌨️ 快捷键说明

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