From ade191f786fb3997b3f74a76a7d509cf452cd91b Mon Sep 17 00:00:00 2001 From: martin Date: Mon, 14 Jan 2013 01:49:07 +0000 Subject: [PATCH] SynEdit search: Fix searching multi-line text. Found text could have longer lines (Pattern expected line-end), if start matched. git-svn-id: trunk@39845 - --- components/synedit/syneditsearch.pp | 13 +++++------ components/synedit/test/testsearch.pas | 31 ++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/components/synedit/syneditsearch.pp b/components/synedit/syneditsearch.pp index 2282ca7b31..bed63ab693 100644 --- a/components/synedit/syneditsearch.pp +++ b/components/synedit/syneditsearch.pp @@ -612,13 +612,12 @@ var //DebugLn(['MultiLinePatternFits Forward: line too short']); exit; // line too short end; - if (LineEndPos=length(Pat)) and (CompareEndPos>length(CurLineStr)) then - begin - //DebugLn(['MultiLinePatternFits Forward: line too long']); - exit; // line too long - end; - if (LineStartPos<=length(Pat)) - and (not CompareContent(PChar(CurLineStr),@Pat[LineStartPos], + If (CompareEndPos <> length(CurLineStr)) and + (LineEndPos+1+Length(LineEnding) <= length(Pat)) and + CompareMem(@Pat[LineEndPos+1], PChar(LineEnding), length(LineEnding)) + then + exit; // Not last line, and not same length + if (not CompareContent(PChar(CurLineStr),@Pat[LineStartPos], CompareEndPos)) then begin //DebugLn(['MultiLinePatternFits Forward: line mismatches']); diff --git a/components/synedit/test/testsearch.pas b/components/synedit/test/testsearch.pas index 074e62e7b6..214669344d 100644 --- a/components/synedit/test/testsearch.pas +++ b/components/synedit/test/testsearch.pas @@ -26,6 +26,7 @@ type procedure TestSearchSimpleUtf8; procedure TestSearchSimpleRegEx; procedure FindMatchingBracket; + procedure TestSearchMultiLine; // not regex end; implementation @@ -251,6 +252,36 @@ begin hl.Free; end; +procedure TTestSynSearch.TestSearchMultiLine; +begin + ReCreateEdit; + SetLines(['', // 1 + 'a', + '', + 'b', + '', // 5 + 'a', + 'x', + 'b', + '', + 'a', // 10 + 'x2', + 'b', + '']); + + fTSearch := TSynEditSearch.Create; + fTSearch.Sensitive := False; + fTSearch.Whole := False; + fTSearch.Backwards := False; + fTSearch.RegularExpressions := False; + fTSearch.RegExprMultiLine := False; + fTSearch.Replacement := ''; + + TestFindNext('3 lines middle empty', 'a'+LineEnding+LineEnding+'b', 1,1, 1,9, true, 1,2, 2,4); + TestFindNext('3 lines middle empty - no match', 'a'+LineEnding+LineEnding+'b', 1,5, 1,9, False, 1,2, 2,4); + +end; + //more ftsearch: //function FindAll(const NewText: string): integer; //function FindFirstUTF8(const NewText: string): Integer;