OSDN Git Service

* Fix: Fixed Sort-Order SymbolWorkTable (Section & Other-Section SymbolWorkInfo priority)
authorKoine Yuusuke(koinec) <koinec@users.osdn.me>
Tue, 24 Nov 2015 20:41:36 +0000 (05:41 +0900)
committerKoine Yuusuke(koinec) <koinec@users.osdn.me>
Tue, 24 Nov 2015 20:41:36 +0000 (05:41 +0900)
libgoblin/drd64_libgoblin_symwork.c

index dbff3c0..2349365 100644 (file)
@@ -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; }