*/
If you have a PH account, you can customize your PH profile.
*/

View \LZ.PAS

ChiefLZ LZ77 Compression

Submitted By: Unknown
Rating: starstar (Rate It)


{
SAMPLE PROGRAM TO DEMONSTRATE THE USE OF THE CHIEFLZ v1.00 PACKAGE.
THIS PROGRAM WILL COMPILE FOR THE FOLLOWING PLATFORMS;
     Dos Real mode - TP7, BP7
     Dos DPMI      - BP7, BPW
     Win16         - BPW, TPW, Delphi 1.x
     Win32         - Delphi 2.0x
}


Program LZ;

{$I LZDefine.inc}

{this (aDLL) is now defined (or not) in LZDEFINE.INC}
{$ifdef aDLL}
  {$define ExplicitLink}  {use explicit linking of DLL}
{$endif aDLL}

{$ifdef Windows}
{$ifdef Win32}
  {$MINSTACKSIZE $00004000}
  {$MAXSTACKSIZE $00100000}
  {$IMAGEBASE    $00400000}
  {$APPTYPE      Console}
{$else Win32}
  {$M 20000, 1024}
  {$F+}        { Force Far-Calls }
  {$K+}        { Use smart call-backs for LZReport, etc. }
{$endif Win32}
{$endif Windows}

{$ifdef Delphi}
{
  Link in the Delphi-generated resource file ...
}

  {$R *.RES}
{$endif Delphi}

Uses
{$ifdef Win32}
 {$ifdef aDLL}
  ShareMem,                   { ChiefLZ.DLL exports long-strings ...!!! }
  {$ifdef ExplicitLink}
  LZExplic in 'LZExplic.pas',
  {$else ExplicitLink}
  LZImplic in 'LZImplic.pas',
  {$endif ExplicitLink}
  {$else aDLL}
  ChiefLZ in 'ChiefLZ.pas',
  {$endif aDLL}
{$else Win32}
 {$ifdef aDLL}
  {$ifdef ExplicitLink}
  LZExplic,
  {$else ExplicitLink}
  LZImplic,
  {$endif ExplicitLink}
 {$else aDLL}
  ChiefLZ,
 {$endif aDLL}
{$endif Win32}

{$ifdef Delphi}
  SysUtils,
{$endif Delphi}
{$ifdef Win32}
  Windows,
{$else Win32}
{$ifdef Windows}
{$ifndef DPMI}
  WinCRT,
{$endif DPMI}
{$ifndef Delphi}
  WinDOS, Strings,
{$endif Delphi}
{$else Windows}
  Dos, Strings,
{$endif Windows}
{$endif Win32}
  ChfTypes,
  ChfUtils;

VAR
AutoReplaceAll: boolean;

{$ifdef Win32}
procedure FlushInputBuffer;
begin
  FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE))
end;

function ReadKey32: Char;
var
  NumRead:       Integer;
  HConsoleInput: THandle;
  InputRec:      TInputRecord;
begin
  HConsoleInput := GetStdHandle(STD_INPUT_HANDLE);
  while not ReadConsoleInput(HConsoleInput,
                             InputRec,
                             1,
                             NumRead) or
           (InputRec.EventType <> KEY_EVENT) do;
  Result := InputRec.KeyEvent.AsciiChar
end;
{$endif Win32}

{$ifdef Delphi}
function TimeToStr(const l: LongInt): string;
begin
  Result := FormatDateTime('dd/mm/yy  hh:nna/p',FileDateToDateTime(l))
end;
{$else}
Function TimeToStr(Const L : Longint):String;
Type
  ElementStr = String[10];

procedure FormatElement(Num: word; var EStr: ElementStr);
begin
  Str(Num:2, EStr);
  if Num < 10 then
    EStr[1] := '0'
end;

Var
Result : String[25];
{$ifdef Windows}
Var
T : TDateTime;
{$else}
Var
T : DateTime;
{$endif Windows}
Var
Dd,Mm,Yy,
Hr,Min : ElementStr;

Begin
   UnpackTime(L, T);
   FormatElement(T.Day, Dd);
   FormatElement(T.Month, Mm);
   Str(T.Year:4, Yy);
   FormatElement(T.Hour, Hr);
   FormatElement(T.Min, Min);
   Result := Dd+'/'+Mm+'/'+Yy+'  '+Hr+':'+Min{+':'+Sec};
   TimeToStr := Result;
End;
{$endif Delphi}
{------------------------------------------------------------}

{///////////////////////////////////////////}
Function Confirm(const fRec: TLZReportRec; Const aDest:String):TLZReply;
{$IFDEF Win16} {$ifdef aDLL} export {$else} far {$endif}; {$ENDIF}
{procedure to ask question if target file exists already}
Var
Ch:Char;
Begin
  if AutoReplaceAll then
    begin
      Confirm := LZYes;
      Exit
    end;

  With fRec
  do begin
    Writeln('Target File Exists!!!');
    Writeln('File Name : ',Names);
    Writeln('File Date : ',TimeToStr(Times));

    Writeln('Compressed: ',Sizes);
    Writeln('Real Size : ',uSizes);
    Writeln('Version   : ',FileVersion);
  End;

  Repeat
    Write('OVERWRITE FILE : ', aDest, ' ? (Yes/No/All/Quit) [Y/N/A/Q] : ');
    Readln(Ch);
  Until Upcase(Ch) in ['Y','N','A','Q'];
  Case UpCase(Ch) of
  'A' : begin
          Confirm := LZYes;
          AutoReplaceAll := True {overwrite all others}
        end;
  'N' : begin
           Confirm := LZNo;
           Writeln('Skipping file  : ',aDest)
        end;
  'Q' : Confirm := LZQuit { stop all processing and Exit }
  else
    Confirm := LZYes { Ch = 'Y' }
  End; {Case}
End;
{///////////////////////////////////////////}

Procedure DeMyRep(Const aName: TLZReportRec{String}; Const aSize: Longint);
{$IFDEF Win16} {$ifdef aDLL} export {$else} far {$endif}; {$ENDIF}
{procedure to show progress}
Begin
   if (Length(aName.Names) > 0) and (aSize=-1) then
     Write('Processing file: ',aName.Names,' ')
   else if (asize=-2) then
     Writeln
   else if aSize > 0 then
     Write('.')
End;

{-----------------------------------------------}
function MyRename(var FName: string): boolean;
{$ifdef Win16} {$ifdef aDLL} export {$else} far {$endif}; {$endif}
var
  Ch: Char;
{$ifndef Delphi}
var Result: boolean;
{$endif}
begin
  Write( 'Cannot overwrite ', FName, ' - Rename? [Y/N]' );
  Readln(Ch);
  Result := UpCase(Ch) = 'Y';
  if Result then
    begin
      Write( 'New name: ' );
      Readln(FName)
    end;
{$ifndef Delphi}
  MyRename := Result
{$endif}
end;

{-----------------------------------------------}
Procedure Syntax;
Begin
  Writeln('LZSS Compressor: by Dr A Olowofoyeku (the African Chief), and Chris Rankin.');
  writeln;
  WriteLn('Usage: LZ <InSpec> [OutSpec] [[/U /A[/R[1]] /X /V]]');
  Writeln;
  Writeln('no switch  =  compress a single file (InSpec) to OutSpec');
  Writeln('e.g.          LZ BIG.EXE SMALL.LZZ');
  Writeln;
  Writeln(' /U        =  decompress a single file (InSpec) to OutSpec');
  Writeln(' e.g.         LZ SMALL.LZZ BIG.EXE /U');
  Writeln('');

  Writeln(' /A        =  compress and archive the files (InSpec) into archive (OutSpec)');
  Writeln('e.g.          LZ C:\TEMP\*.* TEMP.LZZ /A');
  Writeln('              Max = ' + {$ifdef Win32} '2048'
                                   {$else}        '600'
                                   {$endif} + ' files in archive');
  Writeln;

  Writeln(' /R        =  recurse through directory structure (for archives)');
  Writeln(' /R1       =  recurse into 1st level directories (for archives)');
  Writeln('e.g.          LZ C:\TEMP\*.* TEMP.LZZ /A /R');
  Writeln;

  Writeln(' /X        =  decompress an LZ archive (InSpec) into directory (OutSpec)');
  Writeln('e.g.          LZ TEMP.LZZ C:\TEMP /X');
  Writeln;


  Writeln(' /V        =  show contents of an LZ archive (InSpec)');
  Writeln('e.g.          LZ TEMP.LZZ /V');

  {$ifdef Windows}
   {$ifdef Win32}
{
    FlushInputBuffer;  // Use these if running within IDE to
    ReadKey32;         // prevent console window from disappearing
}

   {$else}
   {$ifndef DPMI}
    ReadKey;
    DoneWincrt;
    {$endif DPMI}
   {$endif Win32}
  {$endif Windows}

  Halt(1);
End;

{-----------------------------------------------}
{$ifNdef aDLL}
{example of using the LZ object}
Procedure UseObj;
Var
o:LZObj;
l:longint;
Param:string;
Begin
   o {$ifdef Delphi} := LZObj.Create
     {$else} .Init
     {$endif}(ParamStr(1),ParamStr(2));
   {$ifdef Delphi}
   try
   o.QuestionProc := Confirm;
   o.ReportProc := DeMyRep;
   {$else}
   o.SetQuestionProc(Confirm);
   o.SetReportProc(DeMyRep);
   {$endif}
   Param := Uppercase(ParamStr(3));
   if (Param='/U') or (Param='-U') then
     l:=o.Decompress
   else
     l:=o.Compress;
 {$ifdef Delphi}
   finally
     o.Free
   end;
 {$else}
   o.Done;
 {$endif}
   Writeln(l);
   Halt;
End;
{$Endif aDLL}

{///////////////////////////////////////////}
function GetCompressionRatio(const Comp, Orig: LongInt): LongInt;
begin
  if Orig = 0 then
    GetCompressionRatio := 0  { 0%, on the grounds that the file }
  else                        { is still its original size ...   }
    GetCompressionRatio := 100 - ( (100*Comp) div Orig )
end;

{///////////////////////////////////////////}
{///////////////////////////////////////////}
{///////////////////////////////////////////}
{///////////////////////////////////////////}

var
  ReadProc,WriteProc,UserParam: TLZPathStr;
  p: {$ifdef Win32} string;
     {$else}        array[0..79] of Char;
     {$endif}
  i:integer;
  j,k:longint;
  X:PChiefLZArchiveHeader;
  LZRecurseDirs: TLZRecurse;

Begin
  {$ifdef Windows}
   {$ifndef Win32}
   {$ifndef DPMI}
    StrPCopy(WindowTitle, 'Sample ChiefLZ program ');
    ScreenSize.x:=80;
    ScreenSize.y:=250;
    WindowOrg.x := 1;
    WindowOrg.y := 1;
    {$endif DPMI}
   {$endif Win32}
  {$endif Windows}

  if ParamCount < 2 then
  begin
    Syntax;
  end;
 
  {$ifdef ExplicitLink}
     {$ifdef Win32}
       if not LoadChiefLZDLL('') then
         begin
           Writeln('ChiefLZ Error : cannot load ChiefLZ.DLL');
           Halt
         end;
     {$else Win32}
       i := LoadChiefLZDLL(''{'MYDLL.DLL'});
       if i <> 0 then begin
         Writeln('ChiefLZ Error : cannot load ChiefLZ.DLL');
         Writeln('Error Code : ',i);
         Halt;
       end;
     {$endif Win32}
       Writeln('ChiefLZ DLL loaded successfully. Its DLL handle is: ',GetChiefLZDLLHandle);
       Writeln('Working now ... ');
  {$endif ExplicitLink}

{
  UseObj;
  Halt;
}
 
  ReadProc := ParamStr(1);
  WriteProc := ParamStr(2);
  UserParam := Uppercase(ParamStr(3));
  AutoReplaceAll := False; {confirm for each file}

  if (Uppercase(ParamStr(2))='-V') or
     (Uppercase(ParamStr(2))='/V') then begin

    if not IsChiefLZArchive({$ifdef Win32} ReadProc
                            {$else}       @ReadProc[1]
                            {$endif})
    then begin
        Writeln(ReadProc,' is not a ChiefLZ archive!');
        {$ifdef ExplicitLink}
        If UnloadChiefLZDLL
        then Writeln('I have unloaded the ChiefLZ.DLL');
        {$endif ExplicitLink}
        Halt;
    end;
    New(X);
  {$ifdef Win32}
    try
  {$endif}
    GetChiefLZArchiveInfo({$ifdef Win32} ReadProc
                          {$else Win32}  Str2PChar(ReadProc)
                          {$endif Win32}, X^);
    j:=0;k:=0;

    Writeln('ChiefLZ archive file: ',ReadProc);
    Writeln('ChiefLZ archive size: ',
              GetChiefLZArchiveSize({$ifdef Win32} ReadProc
                                    {$else Win32}  Str2PChar(ReadProc)
                                    {$endif Win32}),
            ' bytes');

    Writeln('  Real Size   LZ Size  Ratio   Date      Time    Version   FileName');
    Writeln('------------------------------------------------------------------');
    for i := 1 to X^.Count do
      with X^.Files[i] do
        begin
          inc(j, Sizes);
          inc(k, uSizes);
          If IsDir then
            Write({ Names:13,}
                   '<DIR>':10,
                   0:10,
                   0:6 )
          else
            Write( {Names:13,}
                   uSizes:10,
                   Sizes:10,
                   GetCompressionRatio(Sizes,uSizes):6 );
          Write( '%  ',
                  TimeToStr(Times),
                  '  ', FileVersion:8,
                  '   ',GetFullLZName(X^,i) );
          if IsDir then
            Writeln('\')
          else
            Writeln

        end {for i};

      Writeln;
      Writeln('Number of Files   = ',X^.Count);
      Writeln('Compressed Size   = ',j,' bytes');
      Writeln('Expanded Size     = ',k,' bytes');
      Writeln('Compression Ratio = ', GetCompressionRatio(j,k),'%');

  {$ifdef Win32}
    finally
  {$endif}
    Dispose(X);
  {$ifdef Win32}
    end
  {$endif}
  end
 else
  if (UserParam = '/X') or (UserParam = '-X') then begin
     writeln(LZDearchive({$ifdef Win32} ReadProc, WriteProc,
                         {$else}        Str2PChar(ReadProc), Str2PChar(WriteProc),
                         {$endif} Confirm, DeMyRep, MyRename))
  end else
  if (UserParam = '/A') or (UserParam = '-A') then begin
 
     UserParam := Uppercase(ParamStr(ParamCount));
     if (UserParam = '-R') or (UserParam = '/R') then
       LZRecurseDirs := LZFullRecurse
     else if (UserParam = '-R1') or (UserParam = '/R1') then
       LZRecurseDirs := LZRecurseOnce
     else
       LZRecurseDirs := LZNoRecurse;

     writeln(LZArchive({$ifdef Win32} ReadProc, WriteProc
                       {$else}        Str2PChar(ReadProc), Str2PChar(WriteProc)
                       {$endif}, LZRecurseDirs, DeMyRep))
  end else
  if (UserParam = '/U') or (UserParam = '-U') then
  begin
     writeln(LZDecompress({$ifdef Win32} ReadProc, WriteProc,
                          {$else}        Str2PChar(ReadProc), Str2PChar(WriteProc),
                          {$endif} Confirm, DemyRep));
     {$ifdef Win32} p := GetChiefLZFileName(ReadProc);
     {$else}        GetChiefLZFileName(Str2PChar(ReadProc), p);
     {$endif}
     Writeln('Filename in header: ',p);
     writeln('FileSize in header: ',
                  GetChiefLZFileSize({$ifdef Win32} ReadProc
                                     {$else}        Str2PChar(ReadProc)
                                     {$endif}) );
  end
  else
  if ParamStr(2)= '/1' then begin
    LZCompressEx({$ifdef Win32} ReadProc,
                 {$else}        Str2PChar(ReadProc),
                 {$endif} Confirm,DeMyRep);
  end else
  if ParamStr(2)= '/2' then begin
    LZDecompressEx({$ifdef Win32} ReadProc,
                   {$else}        Str2PChar(ReadProc),
                   {$endif} Confirm,DeMyRep);
  end
  else begin
     writeln(LZCompress({$ifdef Win32} ReadProc, WriteProc,
                        {$else}        Str2PChar(ReadProc), Str2PChar(WriteProc),
                        {$endif} Confirm, DeMyRep));
  end;

  {$ifdef ExplicitLink}
    Writeln;
    If UnloadChiefLZDLL then
      Writeln('I have successfully unloaded the ChiefLZ DLL')
    else
      Writeln('Error trying to unloaded the ChiefLZ DLL');
    Writeln('Its DLL handle is: ',GetChiefLZDLLHandle);

  {$endif ExplicitLink}

  {$ifdef Windows}
   {$ifdef Win32}
{
    FlushInputBuffer;  // Use these if running within the IDE
    ReadKey32;         // to prevent console window disappearing
}

   {$else}
   {$ifndef DPMI}
    ReadKey;
    DoneWincrt;
    {$endif DPMI}
   {$endif Win32}
  {$endif Windows}
End.

corner
© 1996-2008 CommunityHeaven LLC. All rights reserved. Reproduction in whole or in part, in any form or medium without express written permission is prohibited.
Violators of this policy may be subject to legal action. Please read our Terms Of Use and Privacy Statement for more information.
North American business development: Nicolai Wadstrom. Publisher: Lars Hagelin.