diff --git a/components/synedit/syneditsearch.pp b/components/synedit/syneditsearch.pp index 60e1796ea8..e69eb7f1b1 100644 --- a/components/synedit/syneditsearch.pp +++ b/components/synedit/syneditsearch.pp @@ -815,36 +815,29 @@ begin // multi line pattern forward, multi line pattern backward // regex case insensitive, regex multi line forward, // regex multi line whole word - repeat + + if fRegExpr then begin + // ************ RegExp ************ + // prepare for firs iteration LineStr:=Lines[y]; - if ASupportUnicodeCase and (not fSensitive) and (not fRegExpr) then LineStr := UTF8LowerCase(LineStr); LineLen:=length(LineStr); Line:=PChar(LineStr); - if not IsFirstLine then begin - if FBackwards then begin - if fRegExpr then - x:=LineLen-1 - else - x:=LineLen-SearchLen; - end else - x:=0; - end else begin - IsFirstLine:=false; - if FBackwards then begin - if fRegExpr then - x:=EndPos.X-2 - else - x:=EndPos.X-SearchLen-1; - end else begin + if IsFirstLine then begin + if FBackwards then + x:=EndPos.X-2 + else x:=StartPos.X-1; - end; + end else begin + if FBackwards then + x:=LineLen-1 + else + x:=0; end; x:=MinMax(x,0,LineLen-1); //DebugLn(['TSynEditSearch.FindNextOne Line="',LineStr,'" x=',x,' LineLen=',LineLen]); - // search in the line - if fRegExpr then begin - // regular expression + repeat + // search in the line if SearchRegExprInLine(Max(1,x+1),LineStr) then begin //DebugLn(['TSynEditSearch.FindNextOne Found RegExpr']); FoundStartPos:=Point(RegExprEngine.MatchPos[0],y+1); @@ -856,8 +849,48 @@ begin fRegExprReplace:=RegExprEngine.Substitute(Replacement); exit; end; + + // next line + if FBackwards then + dec(y) + else + inc(y); + + LineStr:=Lines[y]; + LineLen:=length(LineStr); + Line:=PChar(LineStr); + if FBackwards then + x:=LineLen-1 + else + x:=0; + x:=MinMax(x,0,LineLen-1); + //DebugLn(['TSynEditSearch.FindNextOne Line="',LineStr,'" x=',x,' LineLen=',LineLen]); + until (yMaxY); + + end // fRegExpr + else begin + // ************ NOT RegExp ************ + // prepare for firs iteration + LineStr:=Lines[y]; + if ASupportUnicodeCase and (not fSensitive) then LineStr := UTF8LowerCase(LineStr); + LineLen:=length(LineStr); + Line:=PChar(LineStr); + if IsFirstLine then begin + if FBackwards then + x:=EndPos.X-SearchLen-1 + else + x:=StartPos.X-1; end else begin - // normal search + if FBackwards then + x:=LineLen-SearchLen + else + x:=0; + end; + x:=MinMax(x,0,LineLen-1); + //DebugLn(['TSynEditSearch.FindNextOne Line="',LineStr,'" x=',x,' LineLen=',LineLen]); + + repeat + // search in the line MaxPos:=LineLen-SearchLen; if (SearchLen=0) and ((LineLen=0) or IsMultiLinePattern) then begin @@ -912,13 +945,26 @@ begin inc(x,xStep); end; end; - end; - // next line - if FBackwards then - dec(y) - else - inc(y); - until (yMaxY); + + // next line + if FBackwards then + dec(y) + else + inc(y); + + LineStr:=Lines[y]; + if ASupportUnicodeCase and (not fSensitive) then LineStr := UTF8LowerCase(LineStr); + LineLen:=length(LineStr); + Line:=PChar(LineStr); + if FBackwards then + x:=LineLen-SearchLen + else + x:=0; + x:=MinMax(x,0,LineLen-1); + //DebugLn(['TSynEditSearch.FindNextOne Line="',LineStr,'" x=',x,' LineLen=',LineLen]); + until (yMaxY); + + end; // NOT RegExp end; destructor TSynEditSearch.Destroy;