Dylan Smith : richedit: Fixed EM_FINDTEXT to pass todo tests.

Alexandre Julliard julliard at winehq.org
Mon Feb 2 09:01:21 CST 2009


Module: wine
Branch: master
Commit: 95d82484e19ce2da3928798bc29216d3f3856e3c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=95d82484e19ce2da3928798bc29216d3f3856e3c

Author: Dylan Smith <dylan.ah.smith at gmail.com>
Date:   Mon Feb  2 01:32:36 2009 -0500

richedit: Fixed EM_FINDTEXT to pass todo tests.

There was a bug in ME_FindText which would cause the final caracter
offset to be incorrect when a paragraph was crossed while matching
characters.  The problem was the character offset of the wrong
paragraph was used in the calculation of the start offset of the
match.

---

 dlls/riched20/editor.c       |   12 +++++-------
 dlls/riched32/tests/editor.c |   11 ++---------
 2 files changed, 7 insertions(+), 16 deletions(-)

diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c
index 352b827..ca1eb97 100644
--- a/dlls/riched20/editor.c
+++ b/dlls/riched20/editor.c
@@ -1763,7 +1763,6 @@ ME_FindText(ME_TextEditor *editor, DWORD flags, const CHARRANGE *chrg, const WCH
         if (nCurStart + nMatched == ME_StrLen(pCurItem->member.run.strText))
         {
           pCurItem = ME_FindItemFwd(pCurItem, diRun);
-          para = ME_GetParagraph(pCurItem);
           nCurStart = -nMatched;
         }
       }
@@ -1814,14 +1813,13 @@ ME_FindText(ME_TextEditor *editor, DWORD flags, const CHARRANGE *chrg, const WCH
       ME_DisplayItem *pCurItem = item;
       int nCurEnd = nEnd;
       int nMatched = 0;
-      
-      if (nCurEnd - nMatched == 0)
+
+      if (nCurEnd == 0)
       {
         pCurItem = ME_FindItemBack(pCurItem, diRun);
-        para = ME_GetParagraph(pCurItem);
         nCurEnd = ME_StrLen(pCurItem->member.run.strText) + nMatched;
       }
-      
+
       while (pCurItem && ME_CharCompare(pCurItem->member.run.strText->szData[nCurEnd - nMatched - 1], text[nLen - nMatched - 1], (flags & FR_MATCHCASE)))
       {
         if ((flags & FR_WHOLEWORD) && isalnumW(wLastChar))
@@ -1853,7 +1851,8 @@ ME_FindText(ME_TextEditor *editor, DWORD flags, const CHARRANGE *chrg, const WCH
               break;
           }
 
-          nStart = para->member.para.nCharOfs + pCurItem->member.run.nCharOfs + nCurEnd - nMatched;
+          nStart = ME_GetParagraph(pCurItem)->member.para.nCharOfs
+                   + pCurItem->member.run.nCharOfs + nCurEnd - nMatched;
           if (chrgText)
           {
             chrgText->cpMin = nStart;
@@ -1867,7 +1866,6 @@ ME_FindText(ME_TextEditor *editor, DWORD flags, const CHARRANGE *chrg, const WCH
           pCurItem = ME_FindItemBack(pCurItem, diRun);
           /* Don't care about pCurItem becoming NULL here; it's already taken
            * care of in the exterior loop condition */
-          para = ME_GetParagraph(pCurItem);
           nCurEnd = ME_StrLen(pCurItem->member.run.strText) + nMatched;
         }
       }
diff --git a/dlls/riched32/tests/editor.c b/dlls/riched32/tests/editor.c
index e81f033..006da7d 100644
--- a/dlls/riched32/tests/editor.c
+++ b/dlls/riched32/tests/editor.c
@@ -672,15 +672,8 @@ static void run_tests_EM_FINDTEXT(HWND hwnd, const char *name, struct find_s *fi
   int i;
 
   for (i = 0; i < num_tests; i++) {
-    if (*name == '3' && i == 0) {
-        todo_wine {
-            check_EM_FINDTEXT(hwnd, name, &find[i], i);
-            check_EM_FINDTEXTEX(hwnd, name, &find[i], i);
-        }
-    } else {
-        check_EM_FINDTEXT(hwnd, name, &find[i], i);
-        check_EM_FINDTEXTEX(hwnd, name, &find[i], i);
-    }
+    check_EM_FINDTEXT(hwnd, name, &find[i], i);
+    check_EM_FINDTEXTEX(hwnd, name, &find[i], i);
   }
 }
 




More information about the wine-cvs mailing list