home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The World of Computer Software
/
World_Of_Computer_Software-02-387-Vol-3of3.iso
/
t
/
tplzh025.zip
/
LZO.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1993-01-04
|
4KB
|
134 lines
{$A+,B-,D+,E+,F-,G-,I+,L+,N+,O+,R-,S+,V-,X+}
{
LZO.PAS - object-oriented interface for LZH.PAS
LZH.PAS based on:
LZHUF.C English version 1.0 based on Japanese version 29-NOV-1988
Haruhiko OKUMURA: LZSS coded
Haruyasu YOSHIZAKI: Adaptive Huffman Coding coded
Kenji RIKITAKE: Edited and translated to English
Peter Sawatzki,
Wayne Sullivan: Converted to Turbo Pascal 5.0
Joe Jared: Assembler (12/16/92)
[still in progress]
Andres Cvitkovich: object-oriented interface
[to be continued?]
note: ONLY ONE INSTANCE OF THUFF (OR DERIVATES) MAY BE USED BY NOW.
YOU MUST ASSURE THIS IN YOUR PROGRAMS.
THAT MEANS, USAGE OF THUFF IS A 'CRITICAL SECTION'.
}
unit LZO;
interface uses LZH;
const EngineVer = LZH.EngineVer;
type PHuff = ^THuff;
THuff = Object {*** abstract - inherit for use! ***}
Compressing: boolean; { true on compression, false on decompress }
constructor Init;
destructor Done; virtual;
function Compress (Bytes: longint): longint; virtual;
procedure Expand; virtual;
function ReadBuf (var data; size: word): longint; virtual;
function WriteBuf (var data; size: word): longint; virtual;
{ have to return n/of bytes actually read/written
or -1 on error (unix-like) }
procedure Error (code: integer); virtual;
{ code=0: error reading, 1: error writing }
END;
var LZHused: boolean; { true if unit already in use }
implementation
var ActualHuff: PHuff;
procedure ReadBufLo; far; { lo-level procedure, called by LZH }
var res: longint;
begin
with LZHMem^ do begin
inptr := 0;
res := ActualHuff^.ReadBuf (inbuf, SizeOf (inbuf));
if res = -1 then begin
ActualHuff^.Error (0);
inend := 0
end else
inend := word (res)
end
end;
procedure WriteBufLo; far; { lo-level procedure, called by LZH }
begin
with LZHMem^ do begin
if ActualHuff^.WriteBuf (outbuf, outptr) <> outptr then
ActualHuff^.Error (1);
outptr := 0
end
end;
constructor THuff.Init;
begin
if LZHused then exit else LZHused := TRUE;
ActualHuff := @Self;
InitLZH;
LZHMem^.outend := SizeOf (LZHMem^.outbuf); {> unsure about these }
LZHMem^.outptr := 0; {> two lines (placed) }
end;
destructor THuff.Done;
begin
ActualHuff := NIL;
DInitLZH;
LZHused := FALSE
end;
function THuff.Compress (Bytes: longint): longint;
begin
Compressing := TRUE;
{ReadBufLo;}
LZHMem^.Ebytes := Bytes;
Encode;
Compress := LZHMem^.codesize
end;
procedure THuff.Expand;
begin
Compressing := FALSE;
{ ReadBufLo;}
Decode
end;
function THuff.ReadBuf (var data; size: word): longint;
begin
Writeln ('*** ABSTRACT METHOD HAS BEEN CALLED! ***');
Halt (255)
end;
function THuff.WriteBuf (var data; size: word): longint;
begin
Writeln ('*** ABSTRACT METHOD HAS BEEN CALLED! ***');
Halt (255)
end;
procedure THuff.Error (code: integer);
begin
Write ('*** ERROR ');
if code=0 then
Write ('READ')
else
Write ('WRIT');
Writeln ('ING DATA ***');
Halt (255)
end;
begin
ReadToBuffer := ReadBufLo;
WriteFromBuffer := WriteBufLo;
LZHused := FALSE
end.