165 lines
5.1 KiB
ObjectPascal
165 lines
5.1 KiB
ObjectPascal
unit LZODLL;
|
|
|
|
interface
|
|
|
|
uses
|
|
WinAPI.Windows,
|
|
System.SysUtils;
|
|
|
|
const
|
|
Success = 0;
|
|
GenericError = -1;
|
|
OutOfMemory = -2;
|
|
NotCompressible = -3;
|
|
InputOverrun = -4;
|
|
OutputOverrun = -5;
|
|
LookbehindOverrun = -6;
|
|
EndOfFileNotFound = -7;
|
|
InputNotConsumed = -8;
|
|
NotImplemented = -9;
|
|
InvalidArgument = -10;
|
|
|
|
type
|
|
lzo_free_func_t = procedure(self: Pointer; ptr: Pointer); cdecl;
|
|
lzo_alloc_func_t = function(self: Pointer; items, size: LongWord)
|
|
: Pointer; cdecl;
|
|
lzo_progress_func_t = procedure(self: Pointer; a, b: LongWord;
|
|
c: integer); cdecl;
|
|
|
|
lzo_callback_t = Record
|
|
nalloc: lzo_alloc_func_t;
|
|
nfree: lzo_free_func_t;
|
|
nprogress: lzo_progress_func_t;
|
|
user1: Pointer;
|
|
user2: LongWord;
|
|
user3: LongWord;
|
|
end;
|
|
|
|
var
|
|
lzo1x_1_compress: function(const src: Pointer; src_len: NativeUInt;
|
|
dst: Pointer; dst_len: PNativeUInt; wrkmem: Pointer): integer; cdecl;
|
|
lzo1x_1_11_compress: function(const src: Pointer; src_len: NativeUInt;
|
|
dst: Pointer; dst_len: PNativeUInt; wrkmem: Pointer): integer; cdecl;
|
|
lzo1x_1_12_compress: function(const src: Pointer; src_len: NativeUInt;
|
|
dst: Pointer; dst_len: PNativeUInt; wrkmem: Pointer): integer; cdecl;
|
|
lzo1x_1_15_compress: function(const src: Pointer; src_len: NativeUInt;
|
|
dst: Pointer; dst_len: PNativeUInt; wrkmem: Pointer): integer; cdecl;
|
|
lzo1x_999_compress: function(const src: Pointer; src_len: NativeUInt;
|
|
dst: Pointer; dst_len: PNativeUInt; wrkmem: Pointer): integer; cdecl;
|
|
lzo1x_999_compress_level: function(const src: Pointer; src_len: NativeUInt;
|
|
dst: Pointer; dst_len: PNativeUInt; wrkmem: Pointer; const dict: Pointer;
|
|
dict_len: Cardinal; cb: Pointer; compression_level: integer)
|
|
: integer; cdecl;
|
|
lzo1x_decompress_safe: function(const src: Pointer; src_len: NativeUInt;
|
|
dst: Pointer; dst_len: PNativeUInt): integer cdecl;
|
|
lzo1c_999_compress: function(const src: Pointer; src_len: NativeUInt;
|
|
dst: Pointer; dst_len: PNativeUInt; wrkmem: Pointer): integer; cdecl;
|
|
lzo1c_decompress_safe: function(const src: Pointer; src_len: NativeUInt;
|
|
dst: Pointer; dst_len: PNativeUInt): integer cdecl;
|
|
lzo2a_999_compress: function(const src: Pointer; src_len: NativeUInt;
|
|
dst: Pointer; dst_len: PNativeUInt; wrkmem: Pointer): integer; cdecl;
|
|
lzo2a_decompress_safe: function(const src: Pointer; src_len: NativeUInt;
|
|
dst: Pointer; dst_len: PNativeUInt): integer cdecl;
|
|
lzopro_lzo1x_w03_15_compress: function(const src: Pointer;
|
|
src_len: NativeUInt; dst: Pointer; dst_len: PNativeUInt; wrkmem: Pointer)
|
|
: integer; cdecl;
|
|
lzopro_lzo1x_99_compress: function(const src; src_len: integer; var dst;
|
|
var dst_len; var cb; compression_level: integer): integer; cdecl;
|
|
DLLLoaded: Boolean = False;
|
|
|
|
function lzo1x_99_compress(const src: Pointer; src_len: NativeUInt;
|
|
dst: Pointer; dst_len: PNativeUInt; compression_level: integer): integer;
|
|
|
|
implementation
|
|
|
|
var
|
|
DLLHandle: THandle;
|
|
|
|
procedure nfree(self: Pointer; ptr: Pointer); cdecl;
|
|
begin
|
|
FreeMem(ptr);
|
|
end;
|
|
|
|
function nalloc(self: Pointer; items, size: LongWord): Pointer; cdecl;
|
|
var
|
|
p: Pointer;
|
|
begin
|
|
GetMem(p, size * items);
|
|
Result := p;
|
|
end;
|
|
|
|
procedure nprogress(self: Pointer; a, b: LongWord; c: integer); cdecl;
|
|
begin
|
|
end;
|
|
|
|
function lzo1x_99_compress(const src: Pointer; src_len: NativeUInt;
|
|
dst: Pointer; dst_len: PNativeUInt; compression_level: integer): integer;
|
|
var
|
|
mycb: lzo_callback_t;
|
|
begin
|
|
mycb.nalloc := nalloc;
|
|
mycb.nfree := nfree;
|
|
mycb.nprogress := nprogress;
|
|
Result := lzopro_lzo1x_99_compress(src^, src_len, dst^, dst_len^, mycb,
|
|
compression_level);
|
|
end;
|
|
|
|
procedure Init(Filename: String);
|
|
begin
|
|
if DLLLoaded then
|
|
Exit;
|
|
DLLHandle := LoadLibrary(PChar(ExtractFilePath(ParamStr(0)) + Filename));
|
|
if DLLHandle >= 32 then
|
|
begin
|
|
@lzo1x_1_compress := GetProcAddress(DLLHandle, 'lzo1x_1_compress');
|
|
@lzo1x_1_11_compress := GetProcAddress(DLLHandle, 'lzo1x_1_11_compress');
|
|
@lzo1x_1_12_compress := GetProcAddress(DLLHandle, 'lzo1x_1_12_compress');
|
|
@lzo1x_1_15_compress := GetProcAddress(DLLHandle, 'lzo1x_1_15_compress');
|
|
@lzo1x_999_compress := GetProcAddress(DLLHandle, 'lzo1x_999_compress');
|
|
@lzo1x_999_compress_level := GetProcAddress(DLLHandle,
|
|
'lzo1x_999_compress_level');
|
|
@lzo1x_decompress_safe := GetProcAddress(DLLHandle,
|
|
'lzo1x_decompress_safe');
|
|
@lzo1c_999_compress := GetProcAddress(DLLHandle, 'lzo1c_999_compress');
|
|
@lzo1c_decompress_safe := GetProcAddress(DLLHandle,
|
|
'lzo1c_decompress_safe');
|
|
@lzo2a_999_compress := GetProcAddress(DLLHandle, 'lzo2a_999_compress');
|
|
@lzo2a_decompress_safe := GetProcAddress(DLLHandle,
|
|
'lzo2a_decompress_safe');
|
|
DLLLoaded := Assigned(lzo1x_decompress_safe);
|
|
end
|
|
else
|
|
DLLLoaded := False;
|
|
end;
|
|
|
|
procedure Deinit;
|
|
begin
|
|
if not DLLLoaded then
|
|
Exit;
|
|
FreeLibrary(DLLHandle);
|
|
end;
|
|
|
|
const
|
|
DLLParam = '--lzo=';
|
|
|
|
var
|
|
I: integer;
|
|
DLLFile: String;
|
|
|
|
initialization
|
|
|
|
DLLFile := 'lzo2.dll';
|
|
for I := 1 to ParamCount do
|
|
if ParamStr(I).StartsWith(DLLParam) then
|
|
begin
|
|
DLLFile := ParamStr(I).Substring(DLLParam.Length);
|
|
break;
|
|
end;
|
|
Init(DLLFile);
|
|
|
|
finalization
|
|
|
|
Deinit;
|
|
|
|
end.
|