123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- {************************************************}
- { }
- { Grep message filter example }
- { Copyright (c) 1992 by Borland International }
- { }
- {************************************************}
- program Grep2Msg;
- { Message filters read input from the target program (in this case, GREP)
- by way of StdIn (by using Read or ReadLn), filter the input, then write
- output back to StdOut (using Write or WriteLn). The IDE takes care of
- redirecting the transfer program's output to the filter program, as well
- as redirecting the filter program's output back to the IDE itself.
- }
- {$I-,S-}
- var
- LineNo, E: Word;
- P1,P2: integer;
- Line: String;
- InputBuffer: array[0..4095] of Char;
- OutputBuffer: array[0..4095] of Char;
- { The first data passed back to the IDE by a message filter must always
- be the string 'BI#PIP#OK', followed by a null terminator.
- }
- procedure WriteHeader;
- begin
- Write('BI#PIP#OK'#0);
- end;
- { The beginning of a new file is marked by a #0, the file's name, terminated
- by a #0 character.
- }
- procedure WriteNewFile(const FileName: String);
- begin
- Write(#0, FileName, #0);
- end;
- { Each message line begins with a #1, followed the line number (in low/high
- order), followed by the column number (in low/high order), then the
- message text itself, terminated with a #0 character.
- }
- procedure WriteMessage(Line, Col: Word; const Message: String);
- begin
- Write(#1, Chr(Lo(Line)), Chr(Hi(Line)), Chr(Lo(Col)), Chr(Hi(Col)),
- Message, #0);
- end;
- { The end of the input stream is marked by a #127 character }
- procedure WriteEnd;
- begin
- Write(#127);
- end;
- function TrimLeft(S:String): String;
- var
- i: Integer;
- n: String;
- begin
- i := 1;
- while (i <= Length(s)) and (s[i] = #32) do Inc(i);
- if i <= Length(s) then
- begin
- Move(s[i], n[1], Length(s) - i + 1);
- n[0] := Char(Length(s) - i + 1);
- end
- else n[0] := #0;
- TrimLeft := n;
- end;
- const LastFileName: string = '';
- begin
- SetTextBuf(Input, InputBuffer);
- SetTextBuf(Output, OutputBuffer);
- WriteHeader;
- while not Eof do
- begin
- ReadLn(Line);
- if Line <> '' then
- begin
- P1:=Pos(':',Line);
- if copy(Line, 1, P1)<>LastFileName then
- begin
- LastFileName:=copy(Line,1,P1-1);
- WriteNewFile(LastFileName);
- end;
- P2:=Pos(':',copy(Line,P1+1,255));
- if P2>0 then
- begin
- Val(Copy(Line, P1+1, P2-1), LineNo, E);
- if E = 0 then WriteMessage(LineNo, 1, TrimLeft(Copy(Line, P1+1+P2, 132)));
- end;
- end;
- end;
- WriteEnd;
- end.
|