mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-11-05 15:39:25 +01:00
codetools: BuildLineRanges one pass
git-svn-id: trunk@23819 -
This commit is contained in:
parent
2628fb7656
commit
6f4027077c
@ -623,7 +623,9 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TSourceLog.BuildLineRanges;
|
procedure TSourceLog.BuildLineRanges;
|
||||||
var p,line:integer;
|
var
|
||||||
|
p,line:integer;
|
||||||
|
Cap: Integer;
|
||||||
begin
|
begin
|
||||||
{$IFOPT R+}{$DEFINE RangeChecking}{$ENDIF}
|
{$IFOPT R+}{$DEFINE RangeChecking}{$ENDIF}
|
||||||
{$R-}
|
{$R-}
|
||||||
@ -633,46 +635,37 @@ begin
|
|||||||
FreeMem(FLineRanges);
|
FreeMem(FLineRanges);
|
||||||
FLineRanges:=nil;
|
FLineRanges:=nil;
|
||||||
end;
|
end;
|
||||||
// count line ends
|
// build line range list
|
||||||
FLineCount:=0;
|
FLineCount:=0;
|
||||||
|
if FSource='' then exit;
|
||||||
|
Cap:=100;
|
||||||
|
GetMem(FLineRanges,Cap*SizeOf(TLineRange));
|
||||||
p:=1;
|
p:=1;
|
||||||
|
line:=0;
|
||||||
|
FLineRanges[line].StartPos:=1;
|
||||||
while (p<=fSrcLen) do begin
|
while (p<=fSrcLen) do begin
|
||||||
if (not (FSource[p] in [#10,#13])) then begin
|
if (not (FSource[p] in [#10,#13])) then begin
|
||||||
inc(p);
|
inc(p);
|
||||||
end else begin
|
end else begin
|
||||||
// new line
|
// new line
|
||||||
inc(FLineCount);
|
FLineRanges[line].EndPos:=p;
|
||||||
|
inc(line);
|
||||||
|
if line>=Cap then begin
|
||||||
|
Cap:=Cap*2;
|
||||||
|
ReAllocMem(FLineRanges,Cap*SizeOf(TLineRange));
|
||||||
|
end;
|
||||||
inc(p);
|
inc(p);
|
||||||
if (p<=fSrcLen) and (FSource[p] in [#10,#13])
|
if (p<=fSrcLen) and (FSource[p] in [#10,#13])
|
||||||
and (FSource[p]<>FSource[p-1]) then
|
and (FSource[p]<>FSource[p-1]) then
|
||||||
inc(p);
|
inc(p);
|
||||||
|
FLineRanges[line].StartPos:=p;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
if (FSource<>'') and (not (FSource[fSrcLen] in [#10,#13])) then
|
FLineRanges[line].EndPos:=fSrcLen+1;
|
||||||
|
FLineCount:=line;
|
||||||
|
if not (FSource[FSrcLen] in [#10,#13]) then
|
||||||
inc(FLineCount);
|
inc(FLineCount);
|
||||||
// build line range list
|
ReAllocMem(FLineRanges,FLineCount*SizeOf(TLineRange));
|
||||||
if FLineCount>0 then begin
|
|
||||||
GetMem(FLineRanges,FLineCount*SizeOf(TLineRange));
|
|
||||||
p:=1;
|
|
||||||
line:=0;
|
|
||||||
FLineRanges[line].StartPos:=1;
|
|
||||||
FLineRanges[FLineCount-1].EndPos:=fSrcLen+1;
|
|
||||||
while (p<=fSrcLen) do begin
|
|
||||||
if (not (FSource[p] in [#10,#13])) then begin
|
|
||||||
inc(p);
|
|
||||||
end else begin
|
|
||||||
// new line
|
|
||||||
FLineRanges[line].EndPos:=p;
|
|
||||||
inc(line);
|
|
||||||
inc(p);
|
|
||||||
if (p<=fSrcLen) and (FSource[p] in [#10,#13])
|
|
||||||
and (FSource[p]<>FSource[p-1]) then
|
|
||||||
inc(p);
|
|
||||||
if line<FLineCount then
|
|
||||||
FLineRanges[line].StartPos:=p;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
//DebugLn('[TSourceLog.BuildLineRanges] END ',FLineCount);
|
//DebugLn('[TSourceLog.BuildLineRanges] END ',FLineCount);
|
||||||
{$IFDEF RangeChecking}{$R+}{$ENDIF}
|
{$IFDEF RangeChecking}{$R+}{$ENDIF}
|
||||||
end;
|
end;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user