dbgwvar.c

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

C
979
字号
        WndMenuEnable( wnd, MENU_VAR_CLASS, TRUE );
        WndMenuEnable( wnd, MENU_VAR_OPTIONS, TRUE );
//      WndMenuEnable( wnd, MENU_VAR_SHOW_ROOT, v->parent != NULL );
        WndMenuEnable( wnd, MENU_VAR_ARRAY_EXPAND, pointer && v->expand == NULL );
        WndMenuEnable( wnd, MENU_VAR_INSPECT_POINTER, pointer );
        WndMenuEnable( wnd, MENU_VAR_INSPECT_CODE, pointer );
        WndMenuEnable( wnd, MENU_VAR_FIELD_TOP, v->node_type == NODE_FIELD );
        WndMenuEnable( wnd, MENU_VAR_INSPECT_MEMORY, VarIsLValue() );
        WndMenuEnable( wnd, MENU_VAR_WATCH, TRUE );
        WndMenuEnable( wnd, MENU_VAR_INSPECT, TRUE );
#ifdef I_EVER_SOLVE_THE_THORNY_HIDE_PROBLEM
        WndMenuEnable( wnd, MENU_VAR_HIDE, v->node_type == NODE_FIELD );
        WndMenuEnable( wnd, MENU_VAR_UNHIDE, v->expand != NULL );
#endif
        WndMenuEnable( wnd, MENU_VAR_SHOW_TYPE, TRUE );

        WndMenuEnable( wnd, MENU_VAR_POINTER, pointer );
        WndMenuEnable( wnd, MENU_VAR_STRING, pointer );
        if( v->expand == NULL ) {
            if( !VarExpandable( class ) ) {
                WndMenuEnable( wnd, MENU_VAR_MODIFY, TRUE );
                WndMenuEnable( wnd, MENU_VAR_BREAK, TRUE );
                WndMenuEnable( wnd, MENU_VAR_HEX, !pointer );
                WndMenuEnable( wnd, MENU_VAR_DECIMAL, !pointer );
                WndMenuEnable( wnd, MENU_VAR_CHAR, !pointer );
            }
        }
        if( VarDisplayIsStruct( v ) ) {
            WndMenuEnable( wnd, MENU_VAR_SHOW_CODE, TRUE );
            WndMenuEnable( wnd, MENU_VAR_SHOW_INHERIT, TRUE );
            WndMenuEnable( wnd, MENU_VAR_SHOW_COMPILER, TRUE );
            WndMenuEnable( wnd, MENU_VAR_SHOW_PRIVATE, TRUE );
            WndMenuEnable( wnd, MENU_VAR_SHOW_PROTECTED, TRUE );
            WndMenuEnable( wnd, MENU_VAR_SHOW_STATIC, TRUE );
            WndMenuCheck( wnd, MENU_VAR_SHOW_CODE, !VarDisplayIsHidden( v, VARNODE_CODE ) );
            WndMenuCheck( wnd, MENU_VAR_SHOW_INHERIT, !VarDisplayIsHidden( v, VARNODE_INHERIT ) );
            WndMenuCheck( wnd, MENU_VAR_SHOW_COMPILER, !VarDisplayIsHidden( v, VARNODE_COMPILER ) );
            WndMenuCheck( wnd, MENU_VAR_SHOW_PRIVATE, !VarDisplayIsHidden( v, VARNODE_PRIVATE ) );
            WndMenuCheck( wnd, MENU_VAR_SHOW_PROTECTED, !VarDisplayIsHidden( v, VARNODE_PROTECTED ) );
            WndMenuCheck( wnd, MENU_VAR_SHOW_STATIC, !VarDisplayIsHidden( v, VARNODE_STATIC ) );
        }
    }
    WndMenuCheck( wnd, MENU_VAR_SHOW_WHOLE_EXPR, var->show_whole_expr );
    WndMenuCheck( wnd, MENU_VAR_SHOW_MEMBER, VarDisplayShowMembers( &var->i ) );
    WndMenuCheck( wnd, MENU_VAR_FIELD_TOP, v != NULL && VarDisplayedOnTop( v ) );
}


static  WNDMENU VarMenuItem;
static void     VarMenuItem( a_window *wnd, unsigned id, int row, int piece )
{
    var_node            *v;
    dlg_var_expand      varx;
    long                start;
    int                 dummy;
    array_info          ainfo;
    char                *name;
    bool                need_reset;
    var_window          *var = WndVar( wnd );
    piece               =piece;

    need_reset = VarErrState();
    v = VarFindRow( &var->i, row );
    if( v == NULL && VarError ) {
        v = VarFindRoot( &var->i, row, &dummy );
    }
    switch( id ) {
    case MENU_INITIALIZE:
        VarInitPopup( wnd, var, v );
        break;
    case MENU_VAR_SHOW_WHOLE_EXPR:
        var->show_whole_expr = !var->show_whole_expr;
        VarRepaint( wnd );
        break;
    case MENU_VAR_SHOW_MEMBER:
        VarDisplaySetMembers( &var->i, !VarDisplayShowMembers( &var->i ) );
        VarRepaint( wnd );
        break;
    case MENU_VAR_SHOW_CODE:
        VarDisplayFlipHide( v, VARNODE_CODE );
        VarRepaint( wnd );
        break;
    case MENU_VAR_SHOW_INHERIT:
        VarDisplayFlipHide( v, VARNODE_INHERIT );
        VarRepaint( wnd );
        break;
    case MENU_VAR_SHOW_COMPILER:
        VarDisplayFlipHide( v, VARNODE_COMPILER );
        VarRepaint( wnd );
        break;
    case MENU_VAR_SHOW_PRIVATE:
        VarDisplayFlipHide( v, VARNODE_PRIVATE );
        VarRepaint( wnd );
        break;
    case MENU_VAR_SHOW_PROTECTED:
        VarDisplayFlipHide( v, VARNODE_PROTECTED );
        VarRepaint( wnd );
        break;
    case MENU_VAR_SHOW_STATIC:
        VarDisplayFlipHide( v, VARNODE_STATIC );
        VarRepaint( wnd );
        break;
#if 0
    case MENU_VAR_SHOW_ROOT:
        VarMoveToRoot( wnd, row, v );
        break;
#endif
    case MENU_VAR_HEX:
        VarDisplaySetHex( v );
        VarRepaint( wnd );
        break;
    case MENU_VAR_DECIMAL:
        VarDisplaySetDecimal( v );
        VarRepaint( wnd );
        break;
    case MENU_VAR_CHAR:
        VarDisplaySetChar( v );
        VarRepaint( wnd );
        break;
    case MENU_VAR_STRING:
        if( v->expand != NULL ) VarDeExpand( v );
        VarDisplaySetString( v );
        VarRepaint( wnd );
        break;
    case MENU_VAR_POINTER:
        if( v->expand != NULL ) VarDeExpand( v );
        VarDisplaySetPointer( v );
        VarRepaint( wnd );
        break;
    case MENU_VAR_INSPECT_CODE:
        need_reset = VarOldErrState();
        break;
    case MENU_VAR_FIELD_TOP:
        VarDisplayOnTop( v, !VarDisplayedOnTop( v ) );
        VarRepaint( wnd );
        break;
#ifdef I_EVER_SOLVE_THE_THORNY_HIDE_PROBLEM
    case MENU_VAR_HIDE:
        VarDisplayHide( v );
        VarRepaint( wnd );
        break;
    case MENU_VAR_UNHIDE:
        VarDisplayUnHide( v );
        VarRepaint( wnd );
        break;
#endif
    case MENU_VAR_SHOW_TYPE:
        VarDisplayType( v, TxtBuff, TXT_LEN );
        DUIMsgBox( TxtBuff );
        break;
    case MENU_VAR_INSPECT_POINTER:
        need_reset = VarOldErrState();
        VarInspectPointer();
        break;
    case MENU_VAR_INSPECT_MEMORY:
        need_reset = VarOldErrState();
        VarInspectMemory();
        break;
    case MENU_VAR_BREAK:
        VarBreakOnWrite( &var->i, v );
        break;
    case MENU_VAR_MODIFY:
        VarModify( wnd, row, VAR_PIECE_VALUE );
        break;
    case MENU_VAR_ARRAY_EXPAND:
        ExprValue( ExprSP );
        varx.start = 0;
        varx.end = 0;
        start = 0;
        switch( ExprSP->info.kind ) {
        case TK_ARRAY:
            TypeArrayInfo( ExprSP->th, ExprSP->lc, &ainfo, NULL );
            start = ainfo.low_bound;
            varx.start = start;
            varx.end = varx.start + ainfo.num_elts - 1;
            /* fall thru */
        case TK_POINTER:
            {
                bool rc;
                FreezeStack();
                VarRepaint( wnd ); // set early so we flush redundant repaints
                rc = DlgVarExpand( &varx );
                UnFreezeStack( FALSE );
                if( rc ) {
                    VarDeExpand( v );
                    VarExpand( &var->i, v, varx.start - start, varx.end - start );
                }
                VarRepaint( wnd ); // again in case we got a repaint while dlg up
            }
        }
        break;
    case MENU_VAR_INSPECT:
        VarBuildName( &var->i, v, FALSE );
        name = DupStr( TxtBuff );
        WndInspectExprSP( name );
        WndFree( name );
        break;
    case MENU_VAR_WATCH:
        VarAddWatch( &var->i, v );
        break;
    case MENU_VAR_EDIT_EXPRESSION:
        VarEdit( wnd, v );
        break;
    case MENU_VAR_NEW_EXPRESSION:
        if( !VarEdit( wnd, NULL ) ) break;
        WndScrollBottom( wnd );
        break;
    case MENU_VAR_DELETE:
        VarRepaint( wnd );
        VarDeExpand( v );
        VarDelete( &var->i, v );
    }
    if( need_reset ) VarOldErrState();
    VarDoneRow( &var->i );
}


static void FmtName( var_window *var, var_node *v, wnd_line_piece *line,
                     a_window *wnd, int depth, int inherited, int row )
{
    gui_ord     name_len;

    line->indent = MaxGadgetLength;
    if( !var->show_whole_expr ) {
        inherited += depth;
    }
    line->indent += ( INDENT_AMOUNT * inherited ) * WndAvgCharX( wnd );
    line->text = TxtBuff;
    VarBuildName( &var->i, v, !var->show_whole_expr );
    name_len = WndExtentX( wnd, TxtBuff );
    var->name_end = name_len + line->indent;
    var->i.name_end_row = row;
}


var_node *VarGetDisplayPiece( var_info *i, int row, int piece, int *pdepth, int *pinherit )
{
    var_node    *row_v;
    var_node    *v;

    if( piece >= VAR_PIECE_LAST ) return( NULL );
    if( VarFirstNode( i ) == NULL ) return( NULL );
    if( row >= VarRowTotal( i ) ) return( NULL );
    row_v = VarFindRowNode( i, row );
    if( !row_v->value_valid ) {
        VarSetValue( row_v, LIT( Quest_Marks ) );
        row_v->value_valid = FALSE;
    }
    if( !row_v->gadget_valid ) {
        VarSetGadget( row_v, VARGADGET_NONE );
        row_v->gadget_valid = FALSE;
    }
    v = row_v;
    if( piece == VAR_PIECE_NAME ||
        ( piece == VAR_PIECE_GADGET && row_v->gadget_valid ) ||
        ( piece == VAR_PIECE_VALUE && row_v->value_valid ) ) {
        VarError = FALSE;
    } else if( !_IsOn( SW_TASK_RUNNING ) ) {
        if( row == i->exprsp_cacherow && i->exprsp_cache != NULL ) {
            VarError = FALSE;
            v = i->exprsp_cache;
        } else if( row == i->exprsp_cacherow && i->exprsp_cache_is_error ) {
            VarError = TRUE;
            v = NULL;
        } else {
            VarErrState();
            v = VarFindRow( i, row );
            VarOldErrState();
            i->exprsp_cacherow = row;
            i->exprsp_cache = v;
            i->exprsp_cache_is_error = VarError;
        }
        if( v == NULL ) {
            if( !VarError ) return( NULL );
            v = row_v;
        }
        VarNodeInvalid( v );
        VarErrState();
        ExprValue( ExprSP );
        VarSetGadget( v, VarGetGadget( v ) );
        VarSetOnTop( v, VarGetOnTop( v ) );
        VarSetValue( v, VarGetValue( i, v ) );
        VarOldErrState();
        VarDoneRow( i );
    }
    VarGetDepths( i, v, pdepth, pinherit );
    return( v );
}


static WNDGETLINE VarGetLine;
static  bool    VarGetLine( a_window *wnd, int row, int piece,
                             wnd_line_piece *line )
{
    var_window  *var = WndVar( wnd );
    var_node    *v;
    int         depth, inherited;
    int         indent;
    gui_ord     good_size;
    bool        on_rhs;
    int         outdent;
    var_node    *parent;

    if( piece >= VAR_PIECE_LAST ) {
        v = VarGetDisplayPiece( &var->i, row, VAR_PIECE_NAME, &depth, &inherited );
        if( v == NULL ) return( FALSE );
        line->text = "";
        line->tabstop = FALSE;
        line->static_text = TRUE;
        if( !var->show_whole_expr ) {
            inherited += depth;
        }
        outdent = piece - VAR_PIECE_LAST + 1;
        line->indent = MaxGadgetLength + ( INDENT_AMOUNT * ( inherited - outdent ) ) * WndAvgCharX( wnd );
        if( outdent > inherited ) return( FALSE );
        if( outdent == 1 ) {
            if( v->parent == NULL ) return( FALSE );
            if( VarNextVisibleSibling( &var->i, v ) != NULL ) {
                line->draw_line_hook = TRUE;
            } else {
                line->draw_hook = TRUE;
            }
        } else {
            parent = v->parent;
            while( --outdent > 1 ) {
                parent = parent->parent;
            }

⌨️ 快捷键说明

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