Fix some DPA functions so they pass the new tests.

This commit is contained in:
Felix Nawothnig 2005-07-08 11:30:28 +00:00 committed by Alexandre Julliard
parent 9f4c67d50d
commit 7dde735180
2 changed files with 19 additions and 24 deletions

View File

@ -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;

View File

@ -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);