Contributor: SWAG SUPPORT TEAM Program LZHTest; Uses LZH; Const MaxBuf = 4096; { Must be bigger than the biggest chunk being asked For. } Type BufType = Array[1..MaxBuf] of Byte; BufPtr = ^BufType; Var InBuf, OutBuf : BufPtr; inFile, OutFile : File; s : String; Bytes_Written : LongInt; Size : LongInt; Temp : Word; {$F+} Procedure GetBlock(Var Target; NoBytes : Word; Var Actual_Bytes : Word); Const Posn : Word = 1; Buf : Word = 0; Var Temp : Word; begin if (Posn > Buf) or (Posn + NoBytes > succ(Buf)) then begin if Posn > Buf then begin blockread(inFile, InBuf^, MaxBuf, Buf); Write('+'); end else begin move(InBuf^[Posn], InBuf^[1], Buf - Posn); blockread(inFile, InBuf^[Buf - Posn], MaxBuf - (Buf - Posn), Temp); Buf := Buf - Posn + Temp; Write('+'); end; if Buf = 0 then begin Actual_Bytes := 0; Writeln; Exit; end; Posn := 1; end; move(InBuf^[Posn], Target, NoBytes); inc(Posn, NoBytes); if Posn > succ(Buf) then Actual_Bytes := NoBytes - (Posn - succ(Buf)) else Actual_Bytes := NoBytes; end; Procedure PutBlock(Var Source; NoBytes : Word; Var Actual_Bytes : Word); Const Posn : Word = 1; Var Temp : Word; begin if NoBytes = 0 then { Flush condition } begin blockWrite(OutFile, OutBuf^, pred(Posn), Temp); Exit; end; if (Posn > MaxBuf) or (Posn + NoBytes > succ(MaxBuf)) then begin blockWrite(OutFile, OutBuf^, pred(Posn), Temp); Posn := 1; end; move(Source, OutBuf^[Posn], NoBytes); inc(Posn, NoBytes); Actual_Bytes := NoBytes; end; {$F-} begin if (paramcount <> 3) then begin Writeln('Usage:lzhuf e(Compression)|d(unCompression) inFile outFile'); halt(1); end; s := paramstr(1); if not(s[1] in ['D', 'E', 'd', 'e']) then halt(1); assign(inFile, paramstr(2)); reset(inFile, 1); assign(OutFile, paramstr(3)); reWrite(OutFile, 1); new(InBuf); new(OutBuf); if (upCase(s[1]) = 'E') then begin Size := Filesize(inFile); blockWrite(OutFile, Size, sizeof(LongInt)); LZHPack(Bytes_Written, GetBlock, PutBlock); PutBlock(Size, 0, Temp); end else begin blockread(inFile, Size, sizeof(LongInt)); LZHUnPack(Size, GetBlock, PutBlock); PutBlock(Size, 0, Temp); end; dispose(OutBuf); dispose(InBuf); close(inFile); close(OutFile); end.