[Back to DOS SWAG index] [Back to Main SWAG index] [Original]
{ 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.
[Back to DOS SWAG index] [Back to Main SWAG index] [Original]