Module: wine Branch: master Commit: 1d241bb20053e19359cfa8ec07a99c8efb9120d0 URL: http://source.winehq.org/git/wine.git/?a=commit;h=1d241bb20053e19359cfa8ec07...
Author: Stefan Oberhumer stefan@obssys.com Date: Sat Oct 2 00:49:42 2010 +0200
ntdll: Make NTDLL_mergesort() stable.
---
dlls/ntdll/misc.c | 10 +++++++--- 1 files changed, 7 insertions(+), 3 deletions(-)
diff --git a/dlls/ntdll/misc.c b/dlls/ntdll/misc.c index 39b0ad3..a2c08c5 100644 --- a/dlls/ntdll/misc.c +++ b/dlls/ntdll/misc.c @@ -270,9 +270,9 @@ NTDLL_mergesort( void *arr, void *barr, size_t elemsize, int(__cdecl *compar)(co for (j=m; j<right; j++) memcpy (X(barr,(right+m-j)),X(arr,(j+1)),elemsize);
- for (k=left; k<=right; k++) { - /*arr[k]=(barr[i]<barr[j])?barr[i++]:barr[j--];*/ - if (i != j && compar(X(barr,i),X(barr,j))<0) { + /* i=left; j=right; */ + for (k=left; i<=m && j>m; k++) { + if (compar(X(barr,i),X(barr,j))<=0) { memcpy(X(arr,k),X(barr,i),elemsize); i++; } else { @@ -280,6 +280,10 @@ NTDLL_mergesort( void *arr, void *barr, size_t elemsize, int(__cdecl *compar)(co j--; } } + for (; i<=m; i++, k++) + memcpy(X(arr,k),X(barr,i),elemsize); + for (; j>m; j--, k++) + memcpy(X(arr,k),X(barr,j),elemsize); } #undef X }