Contributor: EDWIN GROOTHUIS          


{$define ARJ}
{$define ZIP}
{$define ARC}
{$define LZH}
{$define ZOO}

function  IdentifyArchive(const Name:string):char;
{
  returns:
    '?': unknown archive
    'A': Arj-archive;
    'Z': Zip-archive
    'L': Lzh-archive
    'C': Arc-archive
    'O': Zoo-archive
}
var       f:PBufStream;
          a:array[0..10] of char;
          bc:word;
          s:string;
begin
  IdentifyArchive:='?';
  if Name='' then
    exit;

  f:=New(PBufStream,Init(Name,stOpenRead,1024));
  if f^.Status<>stOk then
  begin
    Dispose(f,Done);
    exit;
  end;

  f^.Read(a,sizeof(a));
  if f^.Status<>stOk then
  begin
    Dispose(f,Done);
    exit;
  end;
  Dispose(f,Done);

{$ifdef arj}
  if (a[0]=#$60) and (a[1]=#$EA) then
  begin
    IdentifyArchive:='A';  { ARJ }
    exit;
  end;
{$endif}

{$ifdef zip}
  if (a[0]='P') and (a[1]='K') then
  begin
    IdentifyArchive:='Z';  { ZIP }
    exit;
  end;
{$endif}

{$ifdef arc}
  if a[0]=#$1A then
  begin
    IdentifyArchive:='C';  { ARC }
    exit;
  end;
{$endif}

{$ifdef zoo}
  if (a[0]='Z') and (a[1]='O') and (a[2]='O') then
  begin
    IdentifyArchive:='O';  { ZOO }
    exit;
  end;
{$endif}

{$ifdef lzh}
  s:=Name;
  for bc:=1 to length(s) do
    s[bc]:=upcase(s[bc]);
  if copy(s,pos('.',s),4)='.LZH' then
  begin
    IdentifyArchive:='L';  { LZH }
    exit;
  end;
{$endif}

  IdentifyArchive:='?';
end;