mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-05 13:58:04 +02:00
75 lines
1.5 KiB
ObjectPascal
75 lines
1.5 KiB
ObjectPascal
unit avisozlib;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, paszlib;
|
|
|
|
type
|
|
Decode = class
|
|
public
|
|
procedure CHECK_ERR(err: Integer; msg: String);
|
|
procedure EXIT_ERR(const msg: String);
|
|
function test_inflate(compr: Pointer; comprLen : LongInt;
|
|
uncompr: Pointer; uncomprLen : LongInt): PChar;
|
|
constructor Create();
|
|
end;
|
|
|
|
implementation
|
|
|
|
procedure Decode.CHECK_ERR(err: Integer; msg: String);
|
|
begin
|
|
if err <> Z_OK then
|
|
begin
|
|
raise Exception.Create('ERROR: ' + msg);
|
|
Halt(1);
|
|
end;
|
|
end;
|
|
|
|
procedure Decode.EXIT_ERR(const msg: String);
|
|
begin
|
|
raise Exception.Create('ERROR: ' + msg);
|
|
Halt(1);
|
|
end;
|
|
|
|
function Decode.test_inflate(compr: Pointer; comprLen : LongInt;
|
|
uncompr: Pointer; uncomprLen : LongInt): PChar;
|
|
var err: Integer;
|
|
d_stream: TZStream; // decompression stream
|
|
begin
|
|
StrCopy(PChar(uncompr), 'garbage');
|
|
|
|
d_stream.next_in := compr;
|
|
d_stream.avail_in := 0;
|
|
d_stream.next_out := uncompr;
|
|
|
|
err := inflateInit(d_stream);
|
|
CHECK_ERR(err, 'inflateInit');
|
|
|
|
while (d_stream.total_out < uncomprLen) and
|
|
(d_stream.total_in < comprLen) do
|
|
begin
|
|
d_stream.avail_out := 1; // force small buffers
|
|
d_stream.avail_in := 1;
|
|
err := inflate(d_stream, Z_NO_FLUSH);
|
|
if err = Z_STREAM_END then
|
|
break;
|
|
CHECK_ERR(err, 'inflate');
|
|
end;
|
|
|
|
err := inflateEnd(d_stream);
|
|
CHECK_ERR(err, 'inflateEnd');
|
|
|
|
Result:=PChar(uncompr);
|
|
end;
|
|
|
|
constructor Decode.Create();
|
|
begin
|
|
inherited Create;
|
|
end;
|
|
|
|
end.
|
|
|