home *** CD-ROM | disk | FTP | other *** search
- unit DiffEng;
-
- interface
-
- uses
- Classes, SysUtils, NewParse;
-
- type
- TDifference = class(TObject)
- protected
- Source, Comp, Dest: TStrings;
- function Found(Value: string): integer;
- procedure RemoveLeadingBlanks;
- public
- constructor Create(SSource, SComp, SDest: TStrings);
- procedure Convert;
- end;
-
- implementation
-
- constructor TDifference.Create(SSource, SComp, SDest: TStrings);
- begin
- inherited Create;
- Source := SSource;
- Comp := SComp;
- Dest := SDest;
- end;
-
- function TDifference.Found(Value: string): integer;
- var
- i: integer;
- S: string;
- begin
- Result := -1; // assume not found
- for i := 0 to Comp.Count-1 do
- begin
- S := Comp[i];
- if S <> '' then
- if CompareStr(Value, S) = 0 then
- begin
- if i = 0 then
- Result := 0
- else
- Result := i;
- Break;
- end;
- end;
- end;
-
- procedure TDifference.RemoveLeadingBlanks;
- begin
- while (Comp.Count > 0) and (Comp[0] = '') do
- Comp.Delete(0);
- end;
-
- procedure TDifference.Convert;
- var
- i, j: integer;
- Line: integer;
- begin
- Dest.Add('<PRE>');
- for i := 0 to Source.Count-1 do
- begin
- if source[i] <> '' then
- case Found(Source[i]) of
- -1: Dest.Add('<FONT COLOR=GREEN><B><U>'+Source[i]+'</U></B></FONT>'); // doesn't exist so mark deleted
- 0: begin
- // exists at top so copy unmarked - remove found()
- Dest.Add(Source[i]);
- Comp.Delete(0);
- RemoveLeadingBlanks;
- end;
- else //mark all lines up to found() as added - remove found()
- begin
- Line := Found(Source[i]);
- for j := 0 to Line-1 do
- Dest.Add('<FONT COLOR=BROWN><U><I>'+Comp[j]+'</I></U></FONT>');
- Dest.Add(Comp[Line]);
- for j := 0 to Line do
- Comp.Delete(0);
- RemoveLeadingBlanks;
- end;
- end
- else Dest.Add(Source[i]);
- end;
-
- // add any remaining lines from Comp - mark as added
- if Comp.Count > 0 then
- begin
- Dest.Add('<FONT COLOR=BROWN><U><I>');
- Dest.AddStrings(Comp);
- Dest.Add('</I></U></FONT>');
- end;
-
- Dest.Add('</PRE>');
- end;
-
- end.
-