@@ -359,6 +359,9 @@ CreateTreeImageList(VOID)
359
359
static ADVANCED_ENTRY *
360
360
Advanced_GetItem (DWORD dwID)
361
361
{
362
+ if (dwID == DWORD (-1 ))
363
+ return NULL ;
364
+
362
365
for (INT i = 0 ; i < s_AdvancedCount; ++i)
363
366
{
364
367
ADVANCED_ENTRY *pEntry = &s_Advanced[i];
@@ -701,24 +704,52 @@ Advanced_Compare(const void *x, const void *y)
701
704
{
702
705
ADVANCED_ENTRY *pEntry1 = (ADVANCED_ENTRY *)x;
703
706
ADVANCED_ENTRY *pEntry2 = (ADVANCED_ENTRY *)y;
707
+
704
708
DWORD dwParentID1 = pEntry1->dwParentID ;
705
709
DWORD dwParentID2 = pEntry2->dwParentID ;
706
- while (dwParentID1 != dwParentID2)
710
+
711
+ if (dwParentID1 == dwParentID2)
712
+ return lstrcmpi (pEntry1->szText , pEntry2->szText );
713
+
714
+ DWORD i, m, n;
715
+ const UINT MAX_DEPTH = 32 ;
716
+ ADVANCED_ENTRY *pArray1[MAX_DEPTH];
717
+ ADVANCED_ENTRY *pArray2[MAX_DEPTH];
718
+
719
+ // Make ancestor lists
720
+ for (i = m = n = 0 ; i < MAX_DEPTH; ++i)
707
721
{
708
722
ADVANCED_ENTRY *pParent1 = Advanced_GetItem (dwParentID1);
709
723
ADVANCED_ENTRY *pParent2 = Advanced_GetItem (dwParentID2);
710
724
if (!pParent1 && !pParent2)
711
725
break ;
712
- if (!pParent1 && pParent2)
726
+
727
+ if (pParent1)
728
+ {
729
+ pArray1[m++] = pParent1;
730
+ dwParentID1 = pParent1->dwParentID ;
731
+ }
732
+ if (pParent2)
733
+ {
734
+ pArray2[n++] = pParent2;
735
+ dwParentID2 = pParent2->dwParentID ;
736
+ }
737
+ }
738
+
739
+ UINT k = min (m, n);
740
+ for (i = 0 ; i < k; ++i)
741
+ {
742
+ INT nCompare = lstrcmpi (pArray1[m - i - 1 ]->szText , pArray2[n - i - 1 ]->szText );
743
+ if (nCompare < 0 )
713
744
return -1 ;
714
- if (pParent1 && !pParent2 )
745
+ if (nCompare > 0 )
715
746
return 1 ;
716
- INT nCompare = lstrcmpi (pParent1->szText , pParent2->szText );
717
- if (nCompare)
718
- return nCompare;
719
- dwParentID1 = pParent1->dwParentID ;
720
- dwParentID2 = pParent2->dwParentID ;
721
747
}
748
+
749
+ if (m < n)
750
+ return -1 ;
751
+ if (m > n)
752
+ return 1 ;
722
753
return lstrcmpi (pEntry1->szText , pEntry2->szText );
723
754
}
724
755
0 commit comments