[PATCH] riched20: EM_FINDTEXT implementation should match richedit character type
Andrew Eikum
aeikum at codeweavers.com
Fri Mar 22 11:34:42 CDT 2013
---
dlls/riched20/editor.c | 38 +++++++-----
dlls/riched20/tests/editor.c | 137 +++++++++++++++++++++++++++++++------------
2 files changed, 123 insertions(+), 52 deletions(-)
diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c
index b9df118..a19ceec 100644
--- a/dlls/riched20/editor.c
+++ b/dlls/riched20/editor.c
@@ -3850,28 +3850,38 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
}
case EM_FINDTEXT:
{
- FINDTEXTA *ft = (FINDTEXTA *)lParam;
- int nChars = MultiByteToWideChar(CP_ACP, 0, ft->lpstrText, -1, NULL, 0);
- WCHAR *tmp;
LRESULT r;
+ if(!unicode){
+ FINDTEXTA *ft = (FINDTEXTA *)lParam;
+ int nChars = MultiByteToWideChar(CP_ACP, 0, ft->lpstrText, -1, NULL, 0);
+ WCHAR *tmp;
- if ((tmp = ALLOC_N_OBJ(WCHAR, nChars)) != NULL)
- MultiByteToWideChar(CP_ACP, 0, ft->lpstrText, -1, tmp, nChars);
- r = ME_FindText(editor, wParam, &ft->chrg, tmp, NULL);
- FREE_OBJ( tmp );
+ if ((tmp = ALLOC_N_OBJ(WCHAR, nChars)) != NULL)
+ MultiByteToWideChar(CP_ACP, 0, ft->lpstrText, -1, tmp, nChars);
+ r = ME_FindText(editor, wParam, &ft->chrg, tmp, NULL);
+ FREE_OBJ( tmp );
+ }else{
+ FINDTEXTW *ft = (FINDTEXTW *)lParam;
+ r = ME_FindText(editor, wParam, &ft->chrg, ft->lpstrText, NULL);
+ }
return r;
}
case EM_FINDTEXTEX:
{
- FINDTEXTEXA *ex = (FINDTEXTEXA *)lParam;
- int nChars = MultiByteToWideChar(CP_ACP, 0, ex->lpstrText, -1, NULL, 0);
- WCHAR *tmp;
LRESULT r;
+ if(!unicode){
+ FINDTEXTEXA *ex = (FINDTEXTEXA *)lParam;
+ int nChars = MultiByteToWideChar(CP_ACP, 0, ex->lpstrText, -1, NULL, 0);
+ WCHAR *tmp;
- if ((tmp = ALLOC_N_OBJ(WCHAR, nChars)) != NULL)
- MultiByteToWideChar(CP_ACP, 0, ex->lpstrText, -1, tmp, nChars);
- r = ME_FindText(editor, wParam, &ex->chrg, tmp, &ex->chrgText);
- FREE_OBJ( tmp );
+ if ((tmp = ALLOC_N_OBJ(WCHAR, nChars)) != NULL)
+ MultiByteToWideChar(CP_ACP, 0, ex->lpstrText, -1, tmp, nChars);
+ r = ME_FindText(editor, wParam, &ex->chrg, tmp, &ex->chrgText);
+ FREE_OBJ( tmp );
+ }else{
+ FINDTEXTEXW *ex = (FINDTEXTEXW *)lParam;
+ r = ME_FindText(editor, wParam, &ex->chrg, ex->lpstrText, &ex->chrgText);
+ }
return r;
}
case EM_FINDTEXTW:
diff --git a/dlls/riched20/tests/editor.c b/dlls/riched20/tests/editor.c
index d72b4e1..fed9b95 100644
--- a/dlls/riched20/tests/editor.c
+++ b/dlls/riched20/tests/editor.c
@@ -217,68 +217,128 @@ static struct find_s find_tests2[] = {
{0, -1, "wineWine wine", 0, -1},
};
-static void check_EM_FINDTEXT(HWND hwnd, const char *name, struct find_s *f, int id) {
+static WCHAR *atowstr(const char *str)
+{
+ WCHAR *ret;
+ DWORD len;
+ len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
+ ret = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+ MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len);
+ return ret;
+}
+
+static void check_EM_FINDTEXT(HWND hwnd, const char *name, struct find_s *f, int id, BOOL unicode)
+{
int findloc;
- FINDTEXT ft;
- memset(&ft, 0, sizeof(ft));
- ft.chrg.cpMin = f->start;
- ft.chrg.cpMax = f->end;
- ft.lpstrText = f->needle;
- findloc = SendMessage(hwnd, EM_FINDTEXT, f->flags, (LPARAM) &ft);
- ok(findloc == f->expected_loc,
- "EM_FINDTEXT(%s,%d) '%s' in range(%d,%d), flags %08x, got start at %d, expected %d\n",
- name, id, f->needle, f->start, f->end, f->flags, findloc, f->expected_loc);
+
+ if(unicode){
+ FINDTEXTW ftw;
+ memset(&ftw, 0, sizeof(ftw));
+ ftw.chrg.cpMin = f->start;
+ ftw.chrg.cpMax = f->end;
+ ftw.lpstrText = atowstr(f->needle);
+
+ findloc = SendMessage(hwnd, EM_FINDTEXT, f->flags, (LPARAM) &ftw);
+ ok(findloc == f->expected_loc,
+ "EM_FINDTEXT(%s,%d,%u) '%s' in range(%d,%d), flags %08x, got start at %d, expected %d\n",
+ name, id, unicode, f->needle, f->start, f->end, f->flags, findloc, f->expected_loc);
+
+ findloc = SendMessage(hwnd, EM_FINDTEXTW, f->flags, (LPARAM) &ftw);
+ ok(findloc == f->expected_loc,
+ "EM_FINDTEXTW(%s,%d,%u) '%s' in range(%d,%d), flags %08x, got start at %d, expected %d\n",
+ name, id, unicode, f->needle, f->start, f->end, f->flags, findloc, f->expected_loc);
+
+ HeapFree(GetProcessHeap(), 0, (void*)ftw.lpstrText);
+ }else{
+ FINDTEXTA fta;
+ memset(&fta, 0, sizeof(fta));
+ fta.chrg.cpMin = f->start;
+ fta.chrg.cpMax = f->end;
+ fta.lpstrText = f->needle;
+
+ findloc = SendMessage(hwnd, EM_FINDTEXT, f->flags, (LPARAM) &fta);
+ ok(findloc == f->expected_loc,
+ "EM_FINDTEXT(%s,%d,%u) '%s' in range(%d,%d), flags %08x, got start at %d, expected %d\n",
+ name, id, unicode, f->needle, f->start, f->end, f->flags, findloc, f->expected_loc);
+ }
}
static void check_EM_FINDTEXTEX(HWND hwnd, const char *name, struct find_s *f,
- int id) {
+ int id, BOOL unicode)
+{
int findloc;
- FINDTEXTEX ft;
int expected_end_loc;
- memset(&ft, 0, sizeof(ft));
- ft.chrg.cpMin = f->start;
- ft.chrg.cpMax = f->end;
- ft.lpstrText = f->needle;
- findloc = SendMessage(hwnd, EM_FINDTEXTEX, f->flags, (LPARAM) &ft);
- ok(findloc == f->expected_loc,
- "EM_FINDTEXTEX(%s,%d) '%s' in range(%d,%d), flags %08x, start at %d\n",
- name, id, f->needle, f->start, f->end, f->flags, findloc);
- ok(ft.chrgText.cpMin == f->expected_loc,
- "EM_FINDTEXTEX(%s,%d) '%s' in range(%d,%d), flags %08x, start at %d\n",
- name, id, f->needle, f->start, f->end, f->flags, ft.chrgText.cpMin);
- expected_end_loc = ((f->expected_loc == -1) ? -1
- : f->expected_loc + strlen(f->needle));
- ok(ft.chrgText.cpMax == expected_end_loc,
- "EM_FINDTEXTEX(%s,%d) '%s' in range(%d,%d), flags %08x, end at %d, expected %d\n",
- name, id, f->needle, f->start, f->end, f->flags, ft.chrgText.cpMax, expected_end_loc);
+ if(unicode){
+ FINDTEXTEXW ftw;
+ memset(&ftw, 0, sizeof(ftw));
+ ftw.chrg.cpMin = f->start;
+ ftw.chrg.cpMax = f->end;
+ ftw.lpstrText = atowstr(f->needle);
+ findloc = SendMessage(hwnd, EM_FINDTEXTEX, f->flags, (LPARAM) &ftw);
+ ok(findloc == f->expected_loc,
+ "EM_FINDTEXTEX(%s,%d) '%s' in range(%d,%d), flags %08x, start at %d\n",
+ name, id, f->needle, f->start, f->end, f->flags, findloc);
+ ok(ftw.chrgText.cpMin == f->expected_loc,
+ "EM_FINDTEXTEX(%s,%d) '%s' in range(%d,%d), flags %08x, start at %d\n",
+ name, id, f->needle, f->start, f->end, f->flags, ftw.chrgText.cpMin);
+ expected_end_loc = ((f->expected_loc == -1) ? -1
+ : f->expected_loc + strlen(f->needle));
+ ok(ftw.chrgText.cpMax == expected_end_loc,
+ "EM_FINDTEXTEX(%s,%d) '%s' in range(%d,%d), flags %08x, end at %d, expected %d\n",
+ name, id, f->needle, f->start, f->end, f->flags, ftw.chrgText.cpMax, expected_end_loc);
+ HeapFree(GetProcessHeap(), 0, (void*)ftw.lpstrText);
+ }else{
+ FINDTEXTEXA fta;
+ memset(&fta, 0, sizeof(fta));
+ fta.chrg.cpMin = f->start;
+ fta.chrg.cpMax = f->end;
+ fta.lpstrText = f->needle;
+ findloc = SendMessage(hwnd, EM_FINDTEXTEX, f->flags, (LPARAM) &fta);
+ ok(findloc == f->expected_loc,
+ "EM_FINDTEXTEX(%s,%d) '%s' in range(%d,%d), flags %08x, start at %d\n",
+ name, id, f->needle, f->start, f->end, f->flags, findloc);
+ ok(fta.chrgText.cpMin == f->expected_loc,
+ "EM_FINDTEXTEX(%s,%d) '%s' in range(%d,%d), flags %08x, start at %d\n",
+ name, id, f->needle, f->start, f->end, f->flags, fta.chrgText.cpMin);
+ expected_end_loc = ((f->expected_loc == -1) ? -1
+ : f->expected_loc + strlen(f->needle));
+ ok(fta.chrgText.cpMax == expected_end_loc,
+ "EM_FINDTEXTEX(%s,%d) '%s' in range(%d,%d), flags %08x, end at %d, expected %d\n",
+ name, id, f->needle, f->start, f->end, f->flags, fta.chrgText.cpMax, expected_end_loc);
+ }
}
static void run_tests_EM_FINDTEXT(HWND hwnd, const char *name, struct find_s *find,
- int num_tests)
+ int num_tests, BOOL unicode)
{
int i;
for (i = 0; i < num_tests; i++) {
- check_EM_FINDTEXT(hwnd, name, &find[i], i);
- check_EM_FINDTEXTEX(hwnd, name, &find[i], i);
+ check_EM_FINDTEXT(hwnd, name, &find[i], i, unicode);
+ check_EM_FINDTEXTEX(hwnd, name, &find[i], i, unicode);
}
}
-static void test_EM_FINDTEXT(void)
+static void test_EM_FINDTEXT(BOOL unicode)
{
- HWND hwndRichEdit = new_richedit(NULL);
+ HWND hwndRichEdit;
CHARFORMAT2 cf2;
+ if(unicode)
+ hwndRichEdit = new_richeditW(NULL);
+ else
+ hwndRichEdit = new_richedit(NULL);
+
/* Empty rich edit control */
run_tests_EM_FINDTEXT(hwndRichEdit, "1", find_tests,
- sizeof(find_tests)/sizeof(struct find_s));
+ sizeof(find_tests)/sizeof(struct find_s), unicode);
SendMessage(hwndRichEdit, WM_SETTEXT, 0, (LPARAM) haystack);
/* Haystack text */
run_tests_EM_FINDTEXT(hwndRichEdit, "2", find_tests2,
- sizeof(find_tests2)/sizeof(struct find_s));
+ sizeof(find_tests2)/sizeof(struct find_s), unicode);
/* Setting a format on an arbitrary range should have no effect in search
results. This tests correct offset reporting across runs. */
@@ -291,7 +351,7 @@ static void test_EM_FINDTEXT(void)
/* Haystack text, again */
run_tests_EM_FINDTEXT(hwndRichEdit, "2-bis", find_tests2,
- sizeof(find_tests2)/sizeof(struct find_s));
+ sizeof(find_tests2)/sizeof(struct find_s), unicode);
/* Yet another range */
cf2.dwMask = CFM_BOLD | cf2.dwMask;
@@ -301,7 +361,7 @@ static void test_EM_FINDTEXT(void)
/* Haystack text, again */
run_tests_EM_FINDTEXT(hwndRichEdit, "2-bisbis", find_tests2,
- sizeof(find_tests2)/sizeof(struct find_s));
+ sizeof(find_tests2)/sizeof(struct find_s), unicode);
DestroyWindow(hwndRichEdit);
}
@@ -7303,7 +7363,8 @@ START_TEST( editor )
ok(hmoduleRichEdit != NULL, "error: %d\n", (int) GetLastError());
test_WM_CHAR();
- test_EM_FINDTEXT();
+ test_EM_FINDTEXT(FALSE);
+ test_EM_FINDTEXT(TRUE);
test_EM_GETLINE();
test_EM_POSFROMCHAR();
test_EM_SCROLLCARET();
--
1.8.2
More information about the wine-patches
mailing list