From: Koine Yuusuke(koinec) Date: Tue, 24 Nov 2015 20:41:36 +0000 (+0900) Subject: * Fix: Fixed Sort-Order SymbolWorkTable (Section & Other-Section SymbolWorkInfo priority) X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=f9859a9bb616a29eb52d0376633594fb209d8052;p=drdeamon64%2Fdrdeamon64.git * Fix: Fixed Sort-Order SymbolWorkTable (Section & Other-Section SymbolWorkInfo priority) --- diff --git a/libgoblin/drd64_libgoblin_symwork.c b/libgoblin/drd64_libgoblin_symwork.c index dbff3c0..2349365 100644 --- a/libgoblin/drd64_libgoblin_symwork.c +++ b/libgoblin/drd64_libgoblin_symwork.c @@ -57,6 +57,29 @@ void /*---------------------------------------------------------------------- ----------------------------------------------------------------------*/ +int + LibGoblin_SymWork_CompareSymbolWorkInfo( + LibGoblin_SymbolWorkInfo *p_symdata, + LibGoblin_SymbolWorkInfo *p_sympivot ) +{ + if( p_symdata->ptr_address < p_sympivot->ptr_address ) + { return -0x01; } + else if( p_symdata->ptr_address > p_sympivot->ptr_address ) + { return 0x01; } + + if((STT_SECTION == (p_symdata->dw_type & 0x0f)) + && (STT_SECTION != (p_sympivot->dw_type & 0x0f))) + { return -0x01; } + if((STT_SECTION != (p_symdata->dw_type & 0x0f)) + && (STT_SECTION == (p_sympivot->dw_type & 0x0f))) + { return 0x01; } + + return 0x00; +} + + +/*---------------------------------------------------------------------- +----------------------------------------------------------------------*/ void LibGoblin_SymWork_QuickSortWorkTable( LibGoblin_SymbolWorkInfo *p_worktbl, @@ -65,17 +88,19 @@ void { int i_left; int i_right; - Ptr ptr_pivot; + LibGoblin_SymbolWorkInfo t_pivot; i_left = i_min; i_right = i_max; - ptr_pivot = (((p_worktbl + i_min)->ptr_address) >> 1) - + (((p_worktbl + i_max)->ptr_address) >> 1); + memcpy( &t_pivot, (p_worktbl + ((i_min + i_max) / 2)), sizeof( LibGoblin_SymbolWorkInfo ) ); while(1) { - while( (p_worktbl + i_left)->ptr_address < ptr_pivot ) { i_left++; } - while( (p_worktbl + i_right)->ptr_address > ptr_pivot ) { i_right--; } + while( LibGoblin_SymWork_CompareSymbolWorkInfo((p_worktbl + i_left), &t_pivot) < 0 ) + { i_left++; } + while( LibGoblin_SymWork_CompareSymbolWorkInfo((p_worktbl + i_right), &t_pivot) > 0 ) + { i_right--; } + if( i_left >= i_right ) { break; }