Contributor: STEVE WIERENGA           

{
Author: Steve Wierenga
ARJ Viewer
}
{Hello All:
I am releasing these Units to the public domain.  They are Units to view Arj,
Lzh, and Zip Files.  They are by no means professional, and probably have some
bugs.  If you use these in your Programs and feel like giving me credit, I
won't Object...  Here goes: }

Unit ArjV;

(**) Interface (**)

Uses
  Dos,Crt;

Type
  AFHeader = Record  { ArjFileHeader }
    HeadID,
    HdrSize   : Word;
    HeadSize,
    VerNum,
    MinVerNum,
    HostOS,
    ArjFlag,
    Method,
    FType,
    Reserved  : Byte;
    FileTime,
    PackSize,
    OrigSize,
    FileCRC   : LongInt;
    FilePosF,
    FileAcc,
    HostData  : Word;
  end;

Var
  ff     : Integer;
  b      : Byte;
  f      : File;
  sl     : LongInt;
  NR     : Word;
  FHdr   : ^AFHeader;
  s,sss  : String;
  Method : String[8];
  l      : String[80];
  Z,
  totalu,
  totalc : LongInt;
  x,d    : LongInt;
  Dt1,dt2: DateTime;
  i,e    : Integer;
  registered : Boolean;

Procedure ArjView(ArjFile : String);
Function GAN(ArjFile : String): String;

(**) Implementation (**)

Procedure Terminate;
begin
  Write('ARCHPEEK could not find specified File.
  Aborting...');
  Halt;
end;

Procedure ArjView(ArjFile : String);
begin
  New(FHdr);
  Assign(f, arjFile);
  {$I-}
  Reset(F, 1);                     { Open File }
  {$I+}
  If IOResult <> 0 then
    Terminate; { Specified File exists?}
  registered := False;             { Unregistered }
  if not registered then
  begin
    Writeln('ArchPeek 0.01Alpha [UNREGISTERED] Copyright 1993 Steve Wierenga');
    Delay(200);
  end;
  SL := 0;z := 0;TotalU := 0; TotalC := 0;   { Init  Variables }
  sss := GAN(ArjFile);                       { Get the Arj Filename }
  Writeln('Arj FileName: ',SSS);
  Write('   Name           Length      Size       Saved     Method     Date Time      ');
  WriteLn('____________________________________________________________________________');
  ff := 0;
  Repeat
    ff := ff + 1;
    Seek(F,SL);
    BlockRead(F,FHdr^,SizeOf(AFHeader),NR);     { Read the header }
    If (NR = SizeOf(AFHeader)) Then
    begin
      s := '';
      Repeat
        BlockRead(F,B,1);               { Get Char For Compressed Filename }
        If B <> 0 Then
          s := s + Chr(b);              { Put Char in String }
      Until B = 0;                      { Until no more Chars }
      Case Length(S) Of                 { Straighten out String }
        0  : s := s + '            ';
        1  : S := s + '           ';
        2  : s := s + '          ';
        3  : S := S + '         ';
        4  : S := S + '        ';
        5  : S := S + '       ';
        6  : S := S + '      ';
        7  : S := S + '     ';
        8  : S := S + '    ';
        9  : S := S + '   ';
        10 : S := S + '  ';
        11 : S := S + ' ';
        12 : S := S;
      end;
      z := z + 1;
      UnPackTime(FHdr^.FileTime,dt2);  { Get the time of compressed File }
      Case FHdr^.Method Of             { Get compression method }
        0 : Method := 'Stored  ';
        1 : Method := 'Most    ';
        2 : Method := '2nd Most';
        3 : Method := '2nd Fast';
        4 : Method := 'Fastest ';
      end;
      Write( ' ',S,FHdr^.OrigSize:9,FHdr^.PackSize:10);
      { Write Filesizes }
      If ff > 1 then
        { Don't get first Arj File in Arj File }
        Write( (100-FHdr^.PackSize/FHdr^.OrigSize*100):9:0,'%',Method:15)
         { Write ratios, method }
        Else
          Write( Method:25);
      Case dt2.month of               { Show date of compressed File }
        1..9   : Write( '0':4,dt2.month);
        10..12 : Write( dt2.month:4);
      end;
      Write( '/');
      Case dt2.day of
        1..9   : Write( '0',dt2.day);
        10..31 : Write( dt2.day);
      end;
      Write( '/');
      Case dt2.year of
        1980 : Write( '80');
        1981 : Write( '81');
        1982 : Write( '82');
        1983 : Write( '83');
        1984 : Write( '84');
        1985 : Write( '85');
        1986 : Write( '86');
        1987 : Write( '87');
        1988 : Write( '88');
        1989 : Write( '89');
        1990 : Write( '90');
        1991 : Write( '91');
        1992 : Write( '92');
        1993 : Write( '93');
        1994 : Write( '94');
        1995 : Write( '95');
        1996 : Write( '96');
      end;
      Case dt2.hour of                          { Show time of compressed File }
        0..9   : Write( '0':2,dt2.hour,':');
        10..23 : Write( dt2.hour:3,':');
      end;
      Case dt2.min of
        0..9   : Write( '0',dt2.min,':');
        10..59 : Write( dt2.min,':');
      end;
      Case dt2.sec of
        0..9   : Writeln( '0',dt2.sec);
        10..59 : Writeln( dt2.sec);
      end;
      TotalU := TotalU + FHdr^.OrigSize; { Increase total uncompressed size }
      TotalC := TotalC + FHdr^.PackSize; { Increase total compressed size }
      Repeat
        BlockRead(F,B,1);
      Until b = 0;
      BlockRead(F,FHdr^.FileCRC,4);      { Go past File CRC }
      BlockRead(f,NR,2);
      Sl := FilePos(F) + FHdr^.PackSize; { Where are we in File? }
    end;

  Until (FHdr^.HdrSize = 0);  { No more Files? }
  GetFTime(F,x);
  UnPackTime(x,dt1);
  WriteLn('============================================================================');
  Write( (z-1):4,' Files',TotalU:12,TotalC:10,(100-TotalC/TotalU*100):9:0,'%');
  Case dt1.month of                  { Get date and time of Arj File }
    1..9   : Write( '0':19,dt1.month);
    10..12 : Write( dt1.month:20);
  end;
  Write( '/');
  Case dt1.day of
    1..9   : Write( '0',dt1.day);
    10..31 : Write( dt1.day);
  end;
  Write( '/');
  Case dt1.year of
    1980 : Write( '80');
    1981 : Write( '81');
    1982 : Write( '82');
    1983 : Write( '83');
    1984 : Write( '84');
    1985 : Write( '85');
    1986 : Write( '86');
    1987 : Write( '87');
    1988 : Write( '88');
    1989 : Write( '89');
    1990 : Write( '90');
    1991 : Write( '91');
    1992 : Write( '92');
    1993 : Write( '93');
    1994 : Write( '94');
    1995 : Write( '95');
    1996 : Write( '96');
  end;
  Case dt1.hour of
    0..9   : Write( '0':2,dt1.hour,':');
    10..23 : Write( dt1.hour:3,':');
  end;
  Case dt1.min of
    0..9   : Write( '0',dt1.min,':');
    10..59 : Write( dt1.min,':');
  end;
  Case dt1.sec of
    0..9   : Writeln( '0',dt1.sec);
    10..59 : Writeln( dt1.sec);
  end;
  Close(f);
  Dispose(FHdr);  { Done }
end;

Function GAN(ARJFile:String): String;
Var
  Dir  : DirStr;
  Name : NameStr;
  Exts : ExtStr;
begin
  FSplit(ARJFile,Dir,Name,Exts);
  GAN := Name + Exts;
end;

end.