summaryrefslogtreecommitdiff
path: root/packages/chm
diff options
context:
space:
mode:
authormarco <marco@3ad0048d-3df7-0310-abae-a5850022a9f2>2009-10-05 21:10:47 +0000
committermarco <marco@3ad0048d-3df7-0310-abae-a5850022a9f2>2009-10-05 21:10:47 +0000
commit9634a0272586b33bd3f74152e509e680182f89be (patch)
treeb8a420d8f7a6ea233f8a198e1fc97e41820e3fdd /packages/chm
parent27f1a220bf78850f8341f1b9a0b8efa6e2edb204 (diff)
downloadfpc-9634a0272586b33bd3f74152e509e680182f89be.tar.gz
* more memory leaks fixed. Fpdoc is now memsafe except for the fcl-passrc bits
git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@13807 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'packages/chm')
-rw-r--r--packages/chm/src/chmfiftimain.pas25
1 files changed, 21 insertions, 4 deletions
diff --git a/packages/chm/src/chmfiftimain.pas b/packages/chm/src/chmfiftimain.pas
index 4462791e48..519f32a5b1 100644
--- a/packages/chm/src/chmfiftimain.pas
+++ b/packages/chm/src/chmfiftimain.pas
@@ -67,6 +67,7 @@ type
FWriteStream: TStream;
FBlockStream: TMemoryStream;
ParentNode: TFIftiNode;
+ OwnsParentNode : boolean;
function AdjustedWord(AWord: String; out AOffset: Byte; AOldWord: String): String;
procedure ChildIsFull(AWord: String; ANodeOffset: DWord); virtual; abstract;
function GuessIfCanHold(AWord: String): Boolean; virtual; abstract;
@@ -91,6 +92,7 @@ type
public
procedure WriteToStream;
constructor Create(AStream: TStream; AWordList: TIndexedWordList);
+ destructor Destroy; override;
end;
{ TChmSearchReader }
@@ -259,6 +261,7 @@ begin
FActiveLeafNode.Flush(False); // causes the unwritten parts of the tree to be written
end;
+
procedure TChmSearchWriter.WriteHeader ( IsPlaceHolder: Boolean ) ;
var
TmpNode: TFIftiNode;
@@ -344,6 +347,7 @@ begin
end;
procedure TChmSearchWriter.WriteAWord ( AWord: TIndexedWord ) ;
+
begin
if FActiveLeafNode = nil then
begin
@@ -363,7 +367,6 @@ begin
TLeafNode(FActiveLeafNode).AddWord(AWord);
end;
-
procedure TChmSearchWriter.WriteToStream;
begin
WriteHeader(True);
@@ -376,9 +379,16 @@ constructor TChmSearchWriter.Create ( AStream: TStream;
begin
FStream := AStream;
FWordList := AWordList;
+ FActiveLeafNode:=NIL;
+end;
+
+destructor TChmSearchWriter.Destroy;
+begin
+ freeandnil(FActiveLeafNode);
end;
+
{ TLeafNode }
function TFIftiNode.RemainingSpace: DWord;
@@ -391,11 +401,13 @@ begin
inherited Create;
FWriteStream := AStream;
FBlockStream := TMemoryStream.Create;
+ OwnsParentNode :=false;
end;
destructor TFIftiNode.Destroy;
begin
FBlockStream.Free;
+ if OwnsParentNode then ParentNode.Free;
inherited Destroy;
end;
@@ -486,8 +498,10 @@ begin
if NewBlockNeeded or ((NewBlockNeeded = False) and (ParentNode <> nil)) then
begin
if ParentNode = nil then
- ParentNode := TIndexNode.Create(FWriteStream);
-
+ begin
+ ParentNode := TIndexNode.Create(FWriteStream);
+ OwnsParentNode:=True;
+ end;
ParentNode.ChildIsFull(FLastWord, FLastNodeStart);
if (NewBlockNeeded = False) then
ParentNode.Flush(False);
@@ -675,7 +689,10 @@ begin
if NewBlockNeeded then
begin
if ParentNode = nil then
- ParentNode := TIndexNode.Create(FWriteStream);
+ begin
+ ParentNode := TIndexNode.Create(FWriteStream);
+ OwnsParentNode:=True;
+ end;
end;
if ParentNode <> nil then