home *** CD-ROM | disk | FTP | other *** search
/ Delphi Magazine Collection 2001 / Delphi Magazine Collection 20001 (2001).iso / DISKS / Issue47 / Differ / DiffEng.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1999-06-06  |  2.2 KB  |  99 lines

  1. unit DiffEng;
  2.  
  3. interface
  4.  
  5. uses
  6.   Classes, SysUtils, NewParse;
  7.  
  8. type
  9.   TDifference = class(TObject)
  10.   protected
  11.     Source, Comp, Dest: TStrings;
  12.     function Found(Value: string): integer;
  13.     procedure RemoveLeadingBlanks;
  14.   public
  15.     constructor Create(SSource, SComp, SDest: TStrings);
  16.     procedure Convert;
  17.   end;
  18.  
  19. implementation
  20.  
  21. constructor TDifference.Create(SSource, SComp, SDest: TStrings);
  22. begin
  23.   inherited Create;
  24.   Source := SSource;
  25.   Comp := SComp;
  26.   Dest := SDest;
  27. end;
  28.  
  29. function TDifference.Found(Value: string): integer;
  30. var
  31.   i: integer;
  32.   S: string;
  33. begin
  34.   Result := -1; // assume not found
  35.   for i := 0 to Comp.Count-1 do
  36.   begin
  37.     S := Comp[i];
  38.     if S <> '' then
  39.       if CompareStr(Value, S) = 0 then
  40.       begin
  41.         if i = 0 then
  42.           Result := 0
  43.         else
  44.           Result := i;
  45.         Break;
  46.       end;
  47.   end;
  48. end;
  49.  
  50. procedure TDifference.RemoveLeadingBlanks;
  51. begin
  52.   while (Comp.Count > 0) and (Comp[0] = '') do
  53.     Comp.Delete(0);
  54. end;
  55.  
  56. procedure TDifference.Convert;
  57. var
  58.   i, j: integer;
  59.   Line: integer;
  60. begin
  61.   Dest.Add('<PRE>');
  62.   for i := 0 to Source.Count-1 do
  63.   begin
  64.     if source[i] <> '' then
  65.       case Found(Source[i]) of
  66.         -1: Dest.Add('<FONT COLOR=GREEN><B><U>'+Source[i]+'</U></B></FONT>'); // doesn't exist so mark deleted
  67.         0: begin
  68.              // exists at top so copy unmarked - remove found()
  69.              Dest.Add(Source[i]);
  70.              Comp.Delete(0);
  71.              RemoveLeadingBlanks;
  72.            end;
  73.         else //mark all lines up to found() as added - remove found()
  74.           begin
  75.             Line := Found(Source[i]);
  76.             for j := 0 to Line-1 do
  77.               Dest.Add('<FONT COLOR=BROWN><U><I>'+Comp[j]+'</I></U></FONT>');
  78.             Dest.Add(Comp[Line]);
  79.             for j := 0 to Line do
  80.               Comp.Delete(0);
  81.             RemoveLeadingBlanks;
  82.           end;
  83.       end
  84.     else Dest.Add(Source[i]);
  85.   end;
  86.  
  87.   // add any remaining lines from Comp - mark as added
  88.   if Comp.Count > 0 then
  89.   begin
  90.     Dest.Add('<FONT COLOR=BROWN><U><I>');
  91.     Dest.AddStrings(Comp);
  92.     Dest.Add('</I></U></FONT>');
  93.   end;
  94.  
  95.   Dest.Add('</PRE>');
  96. end;
  97.  
  98. end.
  99.