wpsamp.c

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

C
1,543
字号
    }
    if( image->exe_changed ) {
        if( !multi_level ) {
            ErrorMsg( LIT( Exe_Has_Changed ), image->name );
            image->exe_changed = B_FALSE;
        }
    }
    curr_sio->level_open++;
    curr_sio->curr_image = image;
    gatherSort( curr_sio );
    return( 0 );
}



STATIC int smodDetailLine( a_window *wnd, int row, bint multi_level )
/*******************************************************************/
{
    sio_data        *curr_sio;
    mod_info        *mod;

    curr_sio = WndExtra( wnd );
    mod = SModGetModule( wnd, row );
    if( mod->agg_count == 0 && mod->file_count == 2 ) {
        if( !multi_level ) {
            ErrorMsg( LIT( No_Symbol_Info ), mod->name );
        }
        return( row );
    }
    curr_sio->level_open++;
    curr_sio->curr_mod = mod;
    gatherSort( curr_sio );
    return( 0 );
}



STATIC int sfileDetailLine( a_window *wnd, int row, bint multi_level )
/********************************************************************/
{
    sio_data        *curr_sio;
    file_info       *curr_file;

    curr_sio = WndExtra( wnd );
    curr_file = SFileGetFile( wnd, row );
    if( curr_file->rtn_count == 0 ) {
        if( !multi_level ) {
            ErrorMsg( LIT( No_Routine_Names ), curr_file->name );
        }
        return( row );
    }
    curr_sio->level_open++;
    curr_sio->curr_file = curr_file;
    gatherSort( curr_sio );
    return( 0 );
}



STATIC int srtnDetailLine( a_window *wnd, int row, bint multi_level )
/*******************************************************************/
{
    sio_data        *curr_sio;
    rtn_info        *curr_rtn;
    int             line;

    multi_level = multi_level;
    curr_sio = WndExtra( wnd );
    curr_rtn = SRtnGetRoutine( wnd, row );
    curr_sio->curr_rtn = curr_rtn;
    line = srtnOpenDetail( curr_sio, B_TRUE );
    return( line );
}



STATIC int srtnOpenDetail( sio_data *curr_sio, bint go_down )
/***********************************************************/
{
    a_window        *wnd;
    wp_srcfile      *src_file;
    int             line;
    int             top_line;

    wnd = curr_sio->sample_window;
    src_file = curr_sio->src_file;
    if( src_file == NULL ) {
        src_file = WPSourceOpen( curr_sio, B_TRUE );
        if( src_file == NULL ) {
            if( go_down ) {
                curr_sio->level_open = LEVEL_ROUTINE;
                line = ssrcDetailLine( wnd, 0, B_TRUE );
                if( curr_sio->level_open == LEVEL_ROUTINE ) {
                    curr_sio->level_open = LEVEL_FILE;
                }
                return( line );
            }
            curr_sio->level_open = LEVEL_FILE;
            return( 0 );
        }
    }
    curr_sio->level_open = LEVEL_ROUTINE;
    line = src_file->samp_line;
    if( line < 1 ) {
        line = src_file->rtn_line;
    }
    top_line = line - 1 - WndRows( wnd ) / 2;
    if( top_line >= 0 ) {
        WndSetTop( wnd, top_line );
    }
    return( line-1 );
}



STATIC int ssrcDetailLine( a_window *wnd, int row, bint multi_level )
/*******************************************************************/
{
    sio_data        *curr_sio;
    wp_asmfile      *asm_file;
    int             top_line;

    curr_sio = WndExtra( wnd );
    asm_file = WPAsmOpen( curr_sio, row+1, multi_level );
    if( asm_file == NULL ) {
        return( row );
    }
    curr_sio->level_open++;
    curr_sio->asm_file = asm_file;
    top_line = asm_file->entry_line - WndRows( wnd ) / 2;
    if( top_line >= 0 ) {
        WndSetTop( wnd, top_line );
    }
    return( asm_file->entry_line );
}



STATIC int sasmDetailLine( a_window *wnd, int row, bint multi_level )
/*******************************************************************/
{
    wnd=wnd;
    multi_level=multi_level;
    Ring();
    return( row );
}



STATIC void sampleRefresh( a_window *wnd )
/***************************************/
{
    WndZapped( wnd );
}



extern void WPZoomIn( a_window *wnd, int row )
/********************************************/
{
    sio_data        *curr_sio;
    int             detail_rows;
    int             top_line;
    int             old_level;
    int             curr_line;
    bint            multi_level;

    curr_sio = WndExtra( wnd );
    if( row >= curr_sio->level_open && row < STATUS_ROW ) {
        Ring();
        return;
    }
    if( row < curr_sio->level_open ) {
        curr_sio->level_open = row;
        WndSetTop( wnd, 0 );
        gatherSort( curr_sio );
        if( curr_sio->level_open == LEVEL_ROUTINE ) {
            curr_line = srtnOpenDetail( curr_sio, B_FALSE );
        } else {
            curr_line = WPGetRow( curr_sio );
        }
    } else {
        row = row - STATUS_ROW - 1;
        curr_line = row;
        detail_rows = SampleNumRows( wnd );
        if( detail_rows < row+1 ) {
            Ring();
            return;
        }
        multi_level = B_FALSE;
        for( ;; ) {
            old_level = curr_sio->level_open;
            curr_line = overviewDetailRtns[curr_sio->level_open](
                                           wnd, row, multi_level );
            if( old_level == curr_sio->level_open ) break;
            detail_rows = SampleNumRows( wnd );
            if( detail_rows != 1 ) break;
            row = 0;
            multi_level = B_TRUE;
        }
    }
    curr_sio->curr_proc_row = -WND_MAX_ROW;
    curr_sio->curr_display_row = -WND_MAX_ROW;
    detail_rows = SampleNumRows( wnd );
    top_line = WndTop( wnd );
    row = curr_line - top_line;
    if( row >= WndRows( wnd ) ) {
        top_line = curr_line - WndRows( wnd ) / 2;
    }
    if( row < 0 ) {
        top_line = curr_line;
    }
    if( detail_rows-top_line < WndRows( wnd ) ) {
        top_line = detail_rows - WndRows( wnd );
        if( top_line < 0 ) {
            top_line = 0;
        }
    }
    WndSetTop( wnd, top_line );
    WndNewCurrent( wnd, curr_line, PIECE_DETAIL_NAME );
    WndDirty( wnd );
    if( curr_sio->level_open < LEVEL_SOURCE
     && curr_sio->asm_file != NULL ) {
        WPAsmClose( curr_sio->asm_file );
        curr_sio->asm_file = NULL;
    }
    if( curr_sio->level_open < LEVEL_ROUTINE
     && curr_sio->src_file != NULL ) {
        WPSourceClose( curr_sio->src_file );
        curr_sio->src_file = NULL;
    }
}



extern void WPBackOut( a_window * wnd )
/*************************************/
{
    sio_data *      curr_sio;

    curr_sio = WndExtra( wnd );
    if( curr_sio->level_open == 0 ) {
        Ring();
        return;
    }
    WPZoomIn( wnd, curr_sio->level_open-1 );
}



extern void WPDoPopUp( a_window * wnd, gui_menu_struct * gui_menu )
/*****************************************************************/
{
    sio_data *      curr_sio;

    WndPopUp( wnd, gui_menu );
    WndNoSelect( wnd );
    curr_sio = WndExtra( wnd );
    curr_sio->curr_proc_row = -WND_MAX_ROW;
    curr_sio->curr_display_row = -WND_MAX_ROW;
}



extern void WPFindDoPopUp( a_window * wnd, int id )
/*************************************************/
{
    gui_menu_struct *   gui_menu;
    int                 index;

    index = 0;
    for( ;; ) {
        gui_menu = &sampleMenu[index++];
        if( gui_menu->id == id ) break;
    }
    WPDoPopUp( wnd, gui_menu );
}



STATIC void gatherSort( sio_data * curr_sio )
/*******************************************/
{
    GatherCurrent( curr_sio );
    SortCurrent( curr_sio );
}



STATIC void setDisplay( a_window * wnd, sio_data * curr_sio, bint do_top )
/************************************************************************/
{
    curr_sio->curr_proc_row = -WND_MAX_ROW;
    curr_sio->curr_display_row = -WND_MAX_ROW;
    if( do_top ) {
        WndSetTop( wnd, 0 );
        WndNewCurrent( wnd, 0, PIECE_DETAIL_NAME );
    }
    WndDirty( wnd );
}



STATIC void sampleMenuItem( a_window * wnd, unsigned id, int row, int piece )
/***************************************************************************/
{
    sio_data *      curr_sio;
    int             sort_type;

    piece=piece;
    curr_sio = WndExtra( wnd );
    row += STATUS_ROW + 1;
    switch( id ) {
    case MENU_INITIALIZE:
        if( row <= STATUS_ROW ) {
            WndMenuGrayAll( wnd );
            if( row < 0 || row-1 >= curr_sio->level_open ) break;
            WndMenuEnable( wnd, MENU_SAMP_ZOOM_IN, B_TRUE );
            break;
        }
        WndMenuEnableAll( wnd );
        WndMenuCheck( wnd, MENU_SAMP_GATHER, GetCurrentGather( curr_sio ) );
        WndMenuCheck( wnd, MENU_SAMP_BAR_MAX_TIME, GetCurrentMaxBar( curr_sio ) );
        WndMenuCheck( wnd, MENU_SAMP_ABS, GetCurrentAbsBar( curr_sio ) );
        WndMenuCheck( wnd, MENU_SAMP_REL, GetCurrentRelBar( curr_sio ) );
        sort_type = GetCurrentSort( curr_sio );
        WndMenuCheck( wnd, MENU_SORT_COUNT, sort_type==SORT_COUNT );
        WndMenuCheck( wnd, MENU_SORT_NAME, sort_type==SORT_NAME );
        if( row <= STATUS_ROW || curr_sio->level_open >= LEVEL_ROUTINE ) {
            WndMenuEnable( wnd, MENU_SAMP_GATHER, B_FALSE );
            WndMenuEnable( wnd, MENU_SAMP_SORT, B_FALSE );
            WndMenuEnable( wnd, MENU_SORT_COUNT, B_FALSE );
            WndMenuEnable( wnd, MENU_SORT_NAME, B_FALSE );
            if( row <= STATUS_ROW ) {
                WndMenuEnable( wnd, MENU_SAMP_BAR_MAX_TIME, B_FALSE );
                WndMenuEnable( wnd, MENU_SAMP_ABS, B_FALSE );
                WndMenuEnable( wnd, MENU_SAMP_REL, B_FALSE );
            }
        }
        break;
    case MENU_SAMP_ZOOM_IN:
        WPZoomIn( wnd, row );
        break;
    case MENU_SAMP_BACK_OUT:
        WPBackOut( wnd );
        break;
//    case MENU_SAMP_DATA:
//        WPSImageOpen( curr_sio );
//        break;
    case MENU_SAMP_GATHER:
        FlipCurrentGather( curr_sio );
        WndMenuCheck( wnd, MENU_SAMP_GATHER, GetCurrentGather( curr_sio ) );
        gatherSort( curr_sio );
        setDisplay( wnd, curr_sio, B_TRUE );
        break;
    case MENU_SAMP_BAR_MAX_TIME:
        FlipCurrentMaxBar( curr_sio );
        WndMenuCheck( wnd, MENU_SAMP_BAR_MAX_TIME, GetCurrentMaxBar( curr_sio ) );
        setDisplay( wnd, curr_sio, B_FALSE );
        break;
    case MENU_SAMP_ABS:
        FlipCurrentAbsBar( curr_sio );
        WndMenuCheck( wnd, MENU_SAMP_ABS, GetCurrentAbsBar( curr_sio ) );
        setDisplay( wnd, curr_sio, B_FALSE );
        break;
    case MENU_SAMP_REL:
        FlipCurrentRelBar( curr_sio );
        WndMenuCheck( wnd, MENU_SAMP_ABS, GetCurrentRelBar( curr_sio ) );
        setDisplay( wnd, curr_sio, B_FALSE );
        break;
    case MENU_SORT_COUNT:
    case MENU_SORT_NAME:
        WndMenuCheck( wnd, MENU_SORT_COUNT, id==MENU_SORT_COUNT );
        WndMenuCheck( wnd, MENU_SORT_NAME, id==MENU_SORT_COUNT );
        if( id == MENU_SORT_COUNT ) {
            SetCurrentSort( curr_sio, SORT_COUNT );
        } else {
            SetCurrentSort( curr_sio, SORT_NAME );
        }
        SortCurrent( curr_sio );
        setDisplay( wnd, curr_sio, B_TRUE );
        break;
    }
}

⌨️ 快捷键说明

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