213
215
write FOnEncodeSaving;
214
216
property DefaultEncoding: string read FDefaultEncoding write FDefaultEncoding;
215
217
property ChangeStamp: int64 read FChangeStamp;
218
property DirectoryCachePool: TCTDirectoryCachePool read FDirectoryCachePool
219
write FDirectoryCachePool;
223
TCodePosition = packed record
227
PCodePosition = ^TCodePosition;
229
TCodeXYPosition = packed record
233
PCodeXYPosition = ^TCodeXYPosition;
235
CleanCodeXYPosition: TCodeXYPosition = (Code:nil; X:0; Y:0);
238
{ TCodeXYPositions - a list of PCodeXYPosition }
240
TCodeXYPositions = class
242
FItems: TFPList; // list of PCodeXYPosition, can be nil
243
function GetCaretsXY(Index: integer): TPoint;
244
function GetCodes(Index: integer): TCodeBuffer;
245
function GetItems(Index: integer): PCodeXYPosition;
246
procedure SetCaretsXY(Index: integer; const AValue: TPoint);
247
procedure SetCodes(Index: integer; const AValue: TCodeBuffer);
248
procedure SetItems(Index: integer; const AValue: PCodeXYPosition);
251
destructor Destroy; override;
253
function Add(const Position: TCodeXYPosition): integer;
254
function Add(X,Y: integer; Code: TCodeBuffer): integer;
255
procedure Assign(Source: TCodeXYPositions);
256
function IsEqual(Source: TCodeXYPositions): boolean;
257
function Count: integer;
258
procedure Delete(Index: integer);
259
function CreateCopy: TCodeXYPositions;
260
function CalcMemSize: PtrUint;
262
property Items[Index: integer]: PCodeXYPosition
263
read GetItems write SetItems; default;
264
property CaretsXY[Index: integer]: TPoint read GetCaretsXY write SetCaretsXY;
265
property Codes[Index: integer]: TCodeBuffer read GetCodes write SetCodes;
269
function CompareCodeBuffers(NodeData1, NodeData2: pointer): integer;
270
function CompareAnsistringWithCodeBuffer(AString, ABuffer: pointer): integer;
271
function CompareIncludedByLink(NodeData1, NodeData2: pointer): integer;
272
function CompareAnsiStringWithIncludedByLink(Key, Data: pointer): integer;
274
function CodePosition(P: integer; Code: TCodeBuffer): TCodePosition;
275
function CodeXYPosition(X, Y: integer; Code: TCodeBuffer): TCodeXYPosition;
276
function CompareCodeXYPositions(Pos1, Pos2: PCodeXYPosition): integer;
278
function CompareCodePositions(Pos1, Pos2: PCodePosition): integer;
280
procedure AddCodePosition(var ListOfPCodeXYPosition: TFPList;
281
const NewCodePos: TCodeXYPosition);
282
function IndexOfCodePosition(var ListOfPCodeXYPosition: TFPList;
283
const APosition: PCodeXYPosition): integer;
284
procedure FreeListOfPCodeXYPosition(ListOfPCodeXYPosition: TFPList);
286
function CreateTreeOfPCodeXYPosition: TAVLTree;
287
procedure AddCodePosition(var TreeOfPCodeXYPosition: TAVLTree;
288
const NewCodePos: TCodeXYPosition);
289
procedure FreeTreeOfPCodeXYPosition(TreeOfPCodeXYPosition: TAVLTree);
290
procedure AddListToTreeOfPCodeXYPosition(SrcList: TFPList;
291
DestTree: TAVLTree; ClearList, CreateCopies: boolean);
292
function ListOfPCodeXYPositionToStr(const ListOfPCodeXYPosition: TFPList): string;
294
function Dbgs(const p: TCodeXYPosition): string; overload;
295
function Dbgs(const p: TCodePosition): string; overload;
222
300
function CompareCodeBuffers(NodeData1, NodeData2: pointer): integer;
223
var CodeBuf1, CodeBuf2: TCodeBuffer;
302
CodeBuf1: TCodeBuffer absolute NodeData1;
303
CodeBuf2: TCodeBuffer absolute NodeData2;
225
CodeBuf1:=TCodeBuffer(NodeData1);
226
CodeBuf2:=TCodeBuffer(NodeData2);
227
305
Result:=CompareFilenames(CodeBuf1.Filename,CodeBuf2.Filename);
308
function CompareAnsistringWithCodeBuffer(AString, ABuffer: pointer): integer;
310
Code: TCodeBuffer absolute ABuffer;
313
Filename:=AnsiString(AString);
314
Result:=CompareFilenames(Filename,Code.Filename);
230
317
function CompareIncludedByLink(NodeData1, NodeData2: pointer): integer;
231
var Link1, Link2: TIncludedByLink;
319
Link1: TIncludedByLink absolute NodeData1;
320
Link2: TIncludedByLink absolute NodeData2;
233
Link1:=TIncludedByLink(NodeData1);
234
Link2:=TIncludedByLink(NodeData2);
235
322
Result:=CompareFilenames(Link1.IncludeFilename,Link2.IncludeFilename);
238
function ComparePAnsiStringWithIncludedByLink(Key, Data: pointer): integer;
325
function CompareAnsiStringWithIncludedByLink(Key, Data: pointer): integer;
240
Result:=CompareFilenames(PAnsiString(Key)^,
327
Result:=CompareFilenames(AnsiString(Key),
241
328
TIncludedByLink(Data).IncludeFilename);
331
function CodePosition(P: integer; Code: TCodeBuffer): TCodePosition;
337
function CodeXYPosition(X, Y: integer; Code: TCodeBuffer): TCodeXYPosition;
344
function CompareCodeXYPositions(Pos1, Pos2: PCodeXYPosition): integer;
346
if Pointer(Pos1^.Code)>Pointer(Pos2^.Code) then Result:=1
347
else if Pointer(Pos1^.Code)<Pointer(Pos2^.Code) then Result:=-1
348
else if Pos1^.Y<Pos2^.Y then Result:=1
349
else if Pos1^.Y>Pos2^.Y then Result:=-1
350
else if Pos1^.X<Pos2^.X then Result:=1
351
else if Pos1^.Y<Pos2^.Y then Result:=-1
355
function CompareCodePositions(Pos1, Pos2: PCodePosition): integer;
357
if Pointer(Pos1^.Code)>Pointer(Pos2^.Code) then Result:=1
358
else if Pointer(Pos1^.Code)<Pointer(Pos2^.Code) then Result:=-1
359
else if Pos1^.P<Pos2^.P then Result:=1
360
else if Pos1^.P>Pos2^.P then Result:=-1
364
procedure AddCodePosition(var ListOfPCodeXYPosition: TFPList;
365
const NewCodePos: TCodeXYPosition);
367
AddCodePos: PCodeXYPosition;
369
if ListOfPCodeXYPosition=nil then ListOfPCodeXYPosition:=TFPList.Create;
371
AddCodePos^:=NewCodePos;
372
ListOfPCodeXYPosition.Add(AddCodePos);
375
function IndexOfCodePosition(var ListOfPCodeXYPosition: TFPList;
376
const APosition: PCodeXYPosition): integer;
378
if ListOfPCodeXYPosition=nil then
381
Result:=ListOfPCodeXYPosition.Count-1;
383
and (CompareCodeXYPositions(APosition,
384
PCodeXYPosition(ListOfPCodeXYPosition[Result]))<>0)
390
procedure FreeListOfPCodeXYPosition(ListOfPCodeXYPosition: TFPList);
392
CurCodePos: PCodeXYPosition;
395
if ListOfPCodeXYPosition=nil then exit;
396
for i:=0 to ListOfPCodeXYPosition.Count-1 do begin
397
CurCodePos:=PCodeXYPosition(ListOfPCodeXYPosition[i]);
400
ListOfPCodeXYPosition.Free;
403
function CreateTreeOfPCodeXYPosition: TAVLTree;
405
Result:=TAVLTree.Create(TListSortCompare(@CompareCodeXYPositions));
408
procedure AddCodePosition(var TreeOfPCodeXYPosition: TAVLTree;
409
const NewCodePos: TCodeXYPosition);
411
AddCodePos: PCodeXYPosition;
413
if TreeOfPCodeXYPosition=nil then
414
TreeOfPCodeXYPosition:=TAVLTree.Create(TListSortCompare(@CompareCodeXYPositions));
416
AddCodePos^:=NewCodePos;
417
TreeOfPCodeXYPosition.Add(AddCodePos);
420
procedure FreeTreeOfPCodeXYPosition(TreeOfPCodeXYPosition: TAVLTree);
423
CursorPos: PCodeXYPosition;
425
if TreeOfPCodeXYPosition=nil then exit;
426
ANode:=TreeOfPCodeXYPosition.FindLowest;
427
while ANode<>nil do begin
428
CursorPos:=PCodeXYPosition(ANode.Data);
429
if CursorPos<>nil then
431
ANode:=TreeOfPCodeXYPosition.FindSuccessor(ANode);
433
TreeOfPCodeXYPosition.Free;
436
procedure AddListToTreeOfPCodeXYPosition(SrcList: TFPList; DestTree: TAVLTree;
437
ClearList, CreateCopies: boolean);
440
CodePos: PCodeXYPosition;
441
NewCodePos: PCodeXYPosition;
443
if SrcList=nil then exit;
444
for i:=SrcList.Count-1 downto 0 do begin
445
CodePos:=PCodeXYPosition(SrcList[i]);
446
if DestTree.Find(CodePos)=nil then begin
447
// new position -> add
448
if CreateCopies and (not ClearList) then begin
449
// list items should be kept and copies should be added to the tree
451
NewCodePos^:=CodePos^;
454
DestTree.Add(NewCodePos);
455
end else if ClearList then begin
456
// position already exists and items should be deleted
464
function ListOfPCodeXYPositionToStr(const ListOfPCodeXYPosition: TFPList
470
if ListOfPCodeXYPosition=nil then
474
for i:=0 to ListOfPCodeXYPosition.Count-1 do begin
475
p:=PCodeXYPosition(ListOfPCodeXYPosition[i])^;
476
Result:=Result+' '+Dbgs(p)+LineEnding;
481
function Dbgs(const p: TCodeXYPosition): string;
486
Result:=p.Code.Filename+'(y='+dbgs(p.y)+',x='+dbgs(p.x)+')';
489
function Dbgs(const p: TCodePosition): string;
491
CodeXYPosition: TCodeXYPosition;
493
FillChar(CodeXYPosition,SizeOf(TCodeXYPosition),0);
494
CodeXYPosition.Code:=p.Code;
495
if CodeXYPosition.Code<>nil then begin
496
CodeXYPosition.Code.AbsoluteToLineCol(p.P,CodeXYPosition.Y,CodeXYPosition.X);
498
Result:=Dbgs(CodeXYPosition);
246
503
procedure TCodeCache.Clear;
1267
1549
+MemSizeString(IncludeFilename);
1552
{ TCodeXYPositions }
1554
function TCodeXYPositions.GetItems(Index: integer): PCodeXYPosition;
1556
Result:=PCodeXYPosition(FItems[Index]);
1559
function TCodeXYPositions.GetCaretsXY(Index: integer): TPoint;
1561
Item: PCodeXYPosition;
1564
Result:=Point(Item^.X,Item^.Y);
1567
function TCodeXYPositions.GetCodes(Index: integer): TCodeBuffer;
1569
Item: PCodeXYPosition;
1575
procedure TCodeXYPositions.SetCaretsXY(Index: integer; const AValue: TPoint);
1577
Item: PCodeXYPosition;
1584
procedure TCodeXYPositions.SetCodes(Index: integer; const AValue: TCodeBuffer);
1586
Item: PCodeXYPosition;
1592
procedure TCodeXYPositions.SetItems(Index: integer;
1593
const AValue: PCodeXYPosition);
1595
FItems[Index]:=AValue;
1598
constructor TCodeXYPositions.Create;
1603
destructor TCodeXYPositions.Destroy;
1611
procedure TCodeXYPositions.Clear;
1614
Item: PCodeXYPosition;
1616
if FItems<>nil then begin
1617
for i:=0 to FItems.Count-1 do begin
1625
function TCodeXYPositions.Add(const Position: TCodeXYPosition): integer;
1627
NewItem: PCodeXYPosition;
1631
if FItems=nil then FItems:=TFPList.Create;
1632
Result:=FItems.Add(NewItem);
1635
function TCodeXYPositions.Add(X, Y: integer; Code: TCodeBuffer): integer;
1637
NewItem: TCodeXYPosition;
1642
Result:=Add(NewItem);
1645
procedure TCodeXYPositions.Assign(Source: TCodeXYPositions);
1649
if IsEqual(Source) then exit;
1651
for i:=0 to Source.Count-1 do
1655
function TCodeXYPositions.IsEqual(Source: TCodeXYPositions): boolean;
1657
SrcItem: TCodeXYPosition;
1658
CurItem: TCodeXYPosition;
1663
else if (Source=nil) or (Source.Count<>Count) then
1666
for i:=0 to Count-1 do begin
1667
SrcItem:=Source[i]^;
1669
if (SrcItem.X<>CurItem.X)
1670
or (SrcItem.Y<>CurItem.Y)
1671
or (SrcItem.Code<>CurItem.Code)
1681
function TCodeXYPositions.Count: integer;
1684
Result:=FItems.Count
1689
procedure TCodeXYPositions.Delete(Index: integer);
1691
Item: PCodeXYPosition;
1695
FItems.Delete(Index);
1698
function TCodeXYPositions.CreateCopy: TCodeXYPositions;
1700
Result:=TCodeXYPositions.Create;
1701
Result.Assign(Self);
1704
function TCodeXYPositions.CalcMemSize: PtrUint;
1706
Result:=PtrUInt(InstanceSize);
1708
inc(Result,PtrUInt(FItems.InstanceSize)
1709
+PtrUInt(FItems.Capacity)*SizeOf(TCodeXYPosition));