diff --git a/dlls/comctl32/dpa.c b/dlls/comctl32/dpa.c index 4ce92d29fa0..bd406df4dc4 100644 --- a/dlls/comctl32/dpa.c +++ b/dlls/comctl32/dpa.c @@ -540,15 +540,16 @@ INT WINAPI DPA_InsertPtr (const HDPA hdpa, INT i, LPVOID p) if (!hdpa || i < 0) return -1; - if (i >= 0x7fff) - i = hdpa->nItemCount; - - if (i >= hdpa->nItemCount) - return DPA_SetPtr(hdpa, i, p) ? i : -1; + /* append item if index is out of bounds */ + i = min(hdpa->nItemCount, i); /* create empty spot at the end */ if (!DPA_SetPtr(hdpa, hdpa->nItemCount, 0)) return -1; - memmove (hdpa->ptrs + i + 1, hdpa->ptrs + i, (hdpa->nItemCount - i - 1) * sizeof(LPVOID)); + + if (i != hdpa->nItemCount - 1) + memmove (hdpa->ptrs + i + 1, hdpa->ptrs + i, + (hdpa->nItemCount - i - 1) * sizeof(LPVOID)); + hdpa->ptrs[i] = p; return i; } @@ -574,7 +575,7 @@ BOOL WINAPI DPA_SetPtr (const HDPA hdpa, INT i, LPVOID p) TRACE("(%p %d %p)\n", hdpa, i, p); - if (!hdpa || i < 0 || i > 0x7fff) + if (!hdpa || i < 0) return FALSE; if (hdpa->nItemCount <= i) { @@ -824,13 +825,7 @@ INT WINAPI DPA_Search (const HDPA hdpa, LPVOID pFind, INT nStart, } } - if (uOptions & DPAS_INSERTBEFORE) { - if (r == -1) r = 0; - TRACE("-- ret=%d\n", r); - return r; - } - - if (uOptions & DPAS_INSERTAFTER) { + if (uOptions & (DPAS_INSERTBEFORE | DPAS_INSERTAFTER)) { TRACE("-- ret=%d\n", l); return l; } @@ -942,13 +937,13 @@ VOID WINAPI DPA_EnumCallback (HDPA hdpa, PFNDPAENUMCALLBACK enumProc, TRACE("(%p %p %p)\n", hdpa, enumProc, lParam); if (!hdpa) - return; + return; if (hdpa->nItemCount <= 0) - return; + return; for (i = 0; i < hdpa->nItemCount; i++) { - if ((enumProc)(hdpa->ptrs[i], lParam) == 0) - return; + if ((enumProc)(hdpa->ptrs[i], lParam) == 0) + return; } return; diff --git a/dlls/comctl32/tests/dpa.c b/dlls/comctl32/tests/dpa.c index ffdce0d9cd1..3236ace2ec7 100644 --- a/dlls/comctl32/tests/dpa.c +++ b/dlls/comctl32/tests/dpa.c @@ -229,12 +229,12 @@ static void test_dpa(void) ok(ret == 3, "ret=%d\n", ret); /* Append item using out of bound index */ ret = pDPA_InsertPtr(dpa, 5, (PVOID)2); - todo_wine ok(ret == 4, "ret=%d\n", ret); + ok(ret == 4, "ret=%d\n", ret); /* Append item using DPA_APPEND */ ret = pDPA_InsertPtr(dpa, DPA_APPEND, (PVOID)4); - todo_wine ok(ret == 5, "ret=%d\n", ret); + ok(ret == 5, "ret=%d\n", ret); - todo_wine ok(CheckDPA(dpa, 0x516324, &dw), "dw=0x%lx\n", dw); + ok(CheckDPA(dpa, 0x516324, &dw), "dw=0x%lx\n", dw); for(i = 1; i <= 6; i++) { @@ -306,7 +306,7 @@ static void test_dpa(void) /* DPAS_INSERTBEFORE works just like DPAS_INSERTAFTER */ i = pDPA_Search(dpa, (PVOID)3, 0, CB_CmpLT, 0xdeadbeef, DPAS_SORTED|DPAS_INSERTBEFORE); - todo_wine ok(i == 2, "i=%d\n", i); + ok(i == 2, "i=%d\n", i); /* Re-insert the item */ ret = pDPA_InsertPtr(dpa, 2, (PVOID)3); @@ -355,9 +355,9 @@ static void test_dpa(void) } /* Setting item with huge index should work */ - todo_wine ok(pDPA_SetPtr(dpa2, 0x12345, (PVOID)0xdeadbeef), "\n"); + ok(pDPA_SetPtr(dpa2, 0x12345, (PVOID)0xdeadbeef), "\n"); ret = pDPA_GetPtrIndex(dpa2, (PVOID)0xdeadbeef); - todo_wine ok(ret == 0x12345, "ret=%d\n", ret); + ok(ret == 0x12345, "ret=%d\n", ret); pDPA_DeleteAllPtrs(dpa2); ok(CheckDPA(dpa2, 0, &dw2), "dw2=0x%lx\n", dw2);