1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- 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.
|