Contributor: KEN BURROWS              

{
 MG>    Trying to figure out the fastest way
 MG> to find and delete duplicate strings,
 MG> which are actually file names in an
 MG> ASCII file.

Using the strings and objects unit, pstringcollections can be used to sort and
test for dupes quite easilly.
}

Uses Objects,Strings,Dos;

Const
  inFile  : String = '';
  OutFile : String = '';
  DupFile : String = '';

Type
  NewPCol = Object(TStringCollection)
              function compare(key1,key2:pointer):integer; virtual;
            end;
 PSColl  = ^NewPCol;

Function NewPCol.Compare(key1,key2:pointer):integer;
   Begin
     Compare := StrIComp(key1,key2);
   End;

Procedure Doit;
   Var NewLst,
       DupLst : PSColl;
       s      : string;
       ps     : pstring;
       f      : text;
       i      : integer;
   Procedure WriteEm(pst:Pstring); far;
      begin
        writeln(f,pst^);
      end;
   Begin
     New(NewLst,init(5,5));
     New(DupLst,init(5,5));
     DupLst^.Duplicates := true;
     assign(f,InFile);  reset(f);
     While not Eof(f) do
       Begin
         readln(f,s);
         if   s <> ''
         then begin
                ps := newstr(s);
                i := NewLst^.Count;
                NewLst^.insert(ps);
                if i = NewLst^.Count then DupLst^.insert(ps);
              end;
       End;
     close(f);
     if   NewLst^.count > 0
     then begin
            assign(f,OutFile); rewrite(f);
            NewLst^.forEach(@WriteEm);
            close(f);
          end;
     if   DupLst^.Count > 0
     then begin
            assign(f,DupFile); rewrite(f);
            DupLst^.forEach(@WriteEm);
            close(f);
          end;
     dispose(DupLst,done);
     dispose(NewLst,Done);
  End;

Begin
  if paramcount < 2 then halt;
  InFile := paramstr(1);
  OutFile := paramstr(2);
  DupFile := OutFile;
  Dec(DupFile[0],3);
  DupFile := DupFile + 'DUP';
  if DupFile = OutFile then halt;
  Doit;
End.