/*----------------------------------------------------------------------
----------------------------------------------------------------------*/
+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,
{
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; }