function TLZR.CompressAny(Source, Dest: BufferPtr;
SourceSize: Integer): Integer;
Var
Remaining, chunk : Integer;
Head : ^Word;
Function AddPtr (p : BufferPtr; Offset : Integer) : BufferPtr;
Begin
Result := BufferPtr (Integer (p) + Offset);
End;
begin
Remaining := SourceSize;
Result := 0;
Repeat
If Remaining < BufferMaxSize
Then Begin
chunk := Remaining;
Remaining := 0;
End
Else Begin
chunk := BufferMaxSize;
Dec (Remaining, BufferMaxSize);
End;
// Pointer vom Ziel holen
Head := @Dest^;
// Zielpointer um SizeOf(Word) erhöhen
Dest := AddPtr (Dest, 2);
// Chunk komprimieren und die größe des komprimierten Chunks
// ins erste Word schreiben
Head^ := Compression(Source, Dest, Chunk);
// Quellpointer auf den Anfang vom nächsten Chunk setzen
Source := AddPtr (Source, chunk);
// Zielpointer um die größe des Komprimierten Puffers erhöhen
Dest := AddPtr (Dest, Head^);
// und die neue größe zurückgeben
Inc (Result, Head^);
// und auch den Header berücksichtigen
inc (Result, 2);
Until Remaining = 0;
end;
function TLZR.DeCompressAny(Source, Dest: BufferPtr;
SourceSize: Integer): Integer;
Var
Remaining : Integer;
chunk : ^Word;
NewSize : Word;
Function AddPtr (p : BufferPtr; Offset : Integer) : BufferPtr;
Begin
Result := BufferPtr (Integer (p) + Offset);
End;
begin
Remaining := SourceSize;
Result := 0;
while Remaining > 0
do begin
// im ersten Word steht die größe des Chunks --> merken
chunk := @Source^;
// Quelle um ein Word erhöhen
Source := AddPtr(Source, 2);
// Dekomprimieren und größe merken
NewSize := DeCompression(Source, Dest, chunk^);
// Jetzt Quelle einen Chunk weiter setzen
Source := AddPtr (Source, chunk^);
// und den Zielpointer um die neue Größe erhöhen
Dest := AddPtr (Dest, NewSize);
// Jetzt die Rückgabe anpassen
inc(Result, NewSize);
// Größe des Headers abziehen
dec(Remaining, 2);
// und Größe des Chunks abziehen
dec(Remaining, chunk^);
end;
end;