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 + -
显示快捷键?