Uses MD5,CRT, DOS;

Const
  Hex : array[0..15] of char=('0', '1', '2', '3', '4', '5', '6', '7', '8',
                              '9', 'A', 'B', 'C', 'D', 'E', 'F');

Var
  Hash: array[0..15] of char;
  LoopCounter: byte;

  Parameter: string;
  RedirectToFile: Boolean;
  OutputFile: Text;

  FileHandle: file;
  FileName  : string;
  MySearchRec: SearchRec;

  Dir : DirStr;
  Name: NameStr;
  Ext : ExtStr;



procedure PrintMD5;
begin
  if RedirectToFile then
    writeln(OutputFile,FileName)
  else
    writeln(FileName);
  Reset(FileHandle,1);
{  if IOResult<>0 then
  begin
    if RedirectToFile then
      writeln(OutputFile,'File ' + FileName + ' does not exist')
    else
      writeln('File ' + FileName + ' does not exist');
    close(FileHandle);
    Halt(0);
  end
  else
  begin
{    Hash[0]:='A';}
    Fillchar(Hash[0],16,0);
    FileMD5(FileHandle, Hash);
    for LoopCounter:=0 to 15 do
      if RedirectToFile then
        write(OutputFile,Hex[Ord(Hash[LoopCounter]) shr 4],
                         Hex[Ord(Hash[LoopCounter]) and 15], ' ')
      else
        write(Hex[Ord(Hash[LoopCounter]) shr 4],
                         Hex[Ord(Hash[LoopCounter]) and 15], ' ');

    if RedirectToFile then
      writeln(OutputFile)
    else
      writeln;
{  end;}
  close(FileHandle);
end;

procedure ScanDir(StartDir, FileSpec: string);
Var
  MySearchRec: SearchRec;
begin
{  writeln(StartDir);}
  FindFirst(StartDir+'\'+FileSpec, AnyFile, MySearchrec);
  while DosError=0 do
  begin
    if (MySearchRec.Attr and Directory)<>Directory then
    begin
      FileName:=StartDir+'\'+MySearchRec.Name;
{      writeln(FileName);}
      Assign(FileHandle, StartDir+'\'+MySearchRec.Name);
      PrintMD5;
    end;
    FindNext(MySearchRec);
  end;

  FindFirst(StartDir+'\*.*', Directory, MySearchRec);
  while DosError=0 do
  begin
{    writeln(StartDir+'\'+MySearchRec.Name);}
{    if (MySearchRec.Attr and Directory)=Directory then

      if RedirectToFile then
        writeln(OutputFile,StartDir+'\'+MySearchRec.Name)
      else
        writeln(StartDir+'\'+MySearchRec.Name);}

      if (MySearchRec.Name<>'.') and
         (MySearchRec.Name<>'..') then
      begin
        ScanDir(StartDir+'\'+MySearchRec.Name, FileSpec);
{        Delay(500);}
      end;
{    end
    else
    begin
      FileName:=StartDir+'\'+MySearchRec.Name;
      writeln(FileName);
      Assign(FileHandle, StartDir+'\'+MySearchRec.Name);
      PrintMD5;
    end;}
    FindNext(MySearchRec);
  end;
end;


begin
  writeln;
  writeln('GNU Finger checksummer GPL Kurt Zammit 1999');
  writeln(ParamStr(ParamCount));
  delay(2000);
  if (ParamCount>3) or (ParamCount=0) then
  begin
    writeln('Incorrect command line syntax');
    writeln('Gnu Finger command line Syntax:');
    writeln('GnuFingr [i] path');
    writeln;
    Halt(0);
  end;

  RedirectToFile:=False;
  LoopCounter:=0;
  while (RedirectToFile=False) and (LoopCounter<ParamCount) do
  begin
    LoopCounter:=LoopCounter+1;
    Parameter:=ParamStr(LoopCounter);
    if (Parameter[1]='+') and (UpCase(Parameter[2])='T') then
    begin
      Parameter:=Copy(ParamStr(LoopCounter), 3, Length(ParamStr(LoopCounter))-2);
      writeln(Parameter);
      Assign(OutputFile, Parameter);
      Rewrite(OutputFile);
{      close(OutputFile);}
      RedirectToFile:=True;
      Delay(2000);
    end;
  end;

  if (ParamStr(1)='I') or (ParamStr(1)='i') then
  begin
    FSplit(ParamStr(ParamCount), Dir, Name, Ext);
    writeln(Dir);
    writeln(Copy(Dir,0,Length(Dir)-1));
    writeln;
    writeln(Name+Ext);
    ScanDir(Copy(Dir,0,Length(Dir)-1), Name+Ext);

{    writeln('Hello');}
  end
  else
  begin
    if (Pos('*', ParamStr(ParamCount))=0) and
       (Pos('?', ParamStr(ParamCount))=0) then
    begin
      FileName:=ParamStr(ParamCount);
      Assign(FileHandle, ParamStr(ParamCount));
      PrintMD5;
    end
    else
    begin
      FSplit(ParamStr(ParamCount), Dir, Name, Ext);
      FindFirst(ParamStr(ParamCount), AnyFile, MySearchRec);
      while DosError=0 do
      begin
        if (MySearchRec.Attr and Directory)=0 then
        begin
          FileName:=Dir+MySearchRec.Name;
          Assign(FileHandle, Dir+MySearchRec.Name);
          PrintMD5;
        end;
        FindNext(MySearchRec);
      end;
    end;
  end;
  if RedirectToFile then
    close(OutputFile);
end.
