home *** CD-ROM | disk | FTP | other *** search
-
- { I found an example of DOS redirection using TP. I think it came from either
- Dr. Dobb's or PC Magazine in 1992. I used this in my BinarY TExt (BYTE)
- file tool which performs file splits, merges, encryption/decryption, script
- execution, and complete backwards and forwards byte resolution manipulation.
- }
- UNIT Echo;
-
- INTERFACE
-
- USES DOS;
-
- FUNCTION InputRedirected : Boolean;
- FUNCTION OutputRedirected : Boolean;
- FUNCTION OutputNul : Boolean;
- FUNCTION EchoIsOn : Boolean;
- PROCEDURE EchoOn;
- PROCEDURE EchoOff;
-
- IMPLEMENTATION
-
- FUNCTION InputRedirected : Boolean;
- VAR Regs : Registers; Handle : Word ABSOLUTE Input;
- BEGIN
- WITH Regs DO
- BEGIN
- Ax := $4400;
- Bx := Handle;
- MsDos(Regs);
- IF Dl AND $81 = $81 THEN InputRedirected := False
- ELSE InputRedirected := True;
- END; {With Regs}
- END; {Function InputRedirected}
-
-
- FUNCTION OutputRedirected : Boolean;
- VAR Regs : Registers; Handle : Word ABSOLUTE Output;
- BEGIN
- WITH Regs DO
- BEGIN
- Ax := $4400;
- Bx := Handle;
- MsDos(Regs);
- IF Dl AND $82 = $82 THEN OutputRedirected := False
- ELSE OutputRedirected := True;
- END; {With Regs}
- END; {Function OutputRedirected}
-
-
- FUNCTION OutputNul : Boolean;
- VAR Regs : Registers; Handle : Word ABSOLUTE Output;
- BEGIN
- WITH Regs DO
- BEGIN
- Ax := $4400;
- Bx := Handle;
- MsDos(Regs);
- IF Dl AND $84 <> $84 THEN OutputNul := False
- ELSE OutputNul := True;
- END; {With Regs}
- END; {Function OutputNul}
-
-
- FUNCTION Write40h(DataBuffer : Pointer; Count, Handle : Word) : Word;
- VAR Regs : Registers;
- TYPE DWord = RECORD O, S : Word; END;
- BEGIN
- WITH Regs DO
- BEGIN
- Ds := DWord(DataBuffer).S;
- Dx := DWord(DataBuffer).O;
- Bx := Handle;
- Cx := Count;
- Ah := $40;
- MsDos(Regs);
- IF Flags AND FCarry <> 0
- THEN Write40h := 103 {- "file not open" -}
- ELSE IF Ax < Cx
- THEN Write40h := 101 {- "disk write error" -}
- ELSE Write40h := 0;
- END; {With Regs do}
- END; {Function Write40h}
-
-
- {$F+} FUNCTION EchoOutput(VAR F : TextRec) : Integer; {$F-}
- {- Replacement for Output text file FlushFunc and InOutFunc -}
- BEGIN
- WITH F DO
- BEGIN
- EchoOutput := Write40h(BufPtr, BufPos, 2);
- EchoOutput := Write40h(BufPtr, BufPos, Handle);
- BufPos := 0;
- END; {With F do}
- END; {Function EchoOutput}
-
-
- CONST EchoStatus : Boolean = False; {- PRIVATE to unit Echo -}
-
- PROCEDURE EchoOn;
- BEGIN
- IF OutputRedirected THEN
- BEGIN
- Flush(Output);
- TextRec(Output).InOutFunc := @EchoOutput;
- TextRec(Output).FlushFunc := @EchoOutput;
- EchoStatus := True;
- END; {If OutputRedirected}
- END; {Procedure EchoOn}
-
- PROCEDURE EchoOff;
- BEGIN
- IF OutputRedirected THEN
- BEGIN
- Rewrite(Output);
- EchoStatus := False;
- END; {If OutputRedirected THEN}
- END; {Procedure EchoOff}
-
- FUNCTION EchoIsOn : Boolean;
- BEGIN
- EchoIsOn := EchoStatus;
- END; {Function EchoIsOn}
-
-
- BEGIN {- Unit initialization -}
- EchoOn; {- Echo all redirected output -}
- END.
-
- {-------------------------------------------------------------------}
- PROGRAM EchoDemo;
- USES Echo;
- BEGIN
- IF InputRedirected THEN WriteLn('Input is being redirected');
- IF OutputNul THEN
- BEGIN
- WriteLn('Output is being sent to the Nul device');
- EchoOff;
- END;
- IF OutputRedirected THEN WriteLn('Output is being redirected');
-
- WriteLn('--------1--------');
- EchoOff;
- WriteLn('--------2--------');
- IF NOT OutputNul THEN EchoOn;
- WriteLn('--------3--------');
- EchoOff;
- WriteLn('--------4--------');
- END.