A strange problem. 
Author Message
 A strange problem.

I've run into a bit of a mystery. Below are two functions. One
detects whether input is being redirected. The other detects
whether output is being redirected.

Function OutputRedirected:Boolean;
var rg:registers;
Begin
 rg.ax:=$4400;
 rg.bx:=1;
 MsDos(rg);
 OutputRedirected:=(rg.dl and 128=0) or (rg.dl and 2 = 0);
End;
Function InputRedirected:Boolean;
var rg:registers;
Begin
 rg.ax:=$4400;
 rg.bx:=0;
 MsDos(rg);
 InputRedirected:=(rg.dl and 128=0) or (rg.dl and 1 = 0);
End;

Both of these functions work! But, I wrote the following program

program pip;
uses dos;
var i,j,k:integer;
    rg,rgsv:registers;
begin
 rg.ax:=$4400;
 rg.bx:=0;
 MsDos(rg);
 rgsv.dl:=rg.dl;
for k:=1 to 10 do begin
 readln(i,j);
 writeln(i:5,' + ',j:5,' = ',i+j:5);
end;
writeln('--------------------');
writeln;
for k:=1 to 10 do begin
 writeln(chr(65+random(26)));
end;
writeln('****> ',rgsv.dl);
end.

Now, I prepared a text file called n.txt with 10 lines, each
containing a pair of numbers to be processed.

When I type pip.exe<n.txt, it outputs the answers, and then it
gives  rgsv.dl as being equal to 66.

This answer works for me because input is redirected and should
be detected if

(rg.dl and 128=0) or (rg.dl and 1 = 0)

01000010 = 66 (in binary).

Notice that if rg.dl = 66, then (rg.dl AND 1 = 0) should return
TRUE since 66 is even. So far, so good.

Then, when I type pip.exe>n2.txt and inspect the contents of
n2, I get all of the ouput of pip.exe and at the bottom it shows
rgsv.dl equal to 211.

I have a problem with this. Output redirected should return true
if

(rg.dl and 128=0) or (rg.dl and 2 = 0)

11010011 = 211 (in binary).

Notice that if rgdl = 211 then both (rg.dl AND 128=0) arefalse
AND (rg.dl and 2=0) are false.

And yet the outputredirected function works. It returns true when
output is redirected. I've confirmed it by writing a program which
outputs the value of that function and then I've run the program
using redirection.

What is the cause of this discreprency? TIA.

P.S.,  The reason why pip.pas contains a for loop which outputs random
uppercase letters is because
I wanted to see what value rgsv.dl would have if I tried piping. For
example pip.exe|find "**".
--
Patrick D. Rockwell





Mon, 21 Jul 2003 05:37:30 GMT  
 A strange problem.

Quote:
>I've run into a bit of a mystery. Below are two functions. One
>detects whether input is being redirected. The other detects
>whether output is being redirected.

>Function OutputRedirected:Boolean;
>var rg:registers;
>Begin
> rg.ax:=$4400;
> rg.bx:=1;

         ^

Quote:
> MsDos(rg);
> OutputRedirected:=(rg.dl and 128=0) or (rg.dl and 2 = 0);
>End;
>Function InputRedirected:Boolean;
>var rg:registers;
>Begin
> rg.ax:=$4400;
> rg.bx:=0;

         ^

Quote:
> MsDos(rg);
> InputRedirected:=(rg.dl and 128=0) or (rg.dl and 1 = 0);
>End;

Here is the function from Ralf Brown's interrupt list.

--------D-214400-----------------------------
INT 21 - DOS 2+ - IOCTL - GET DEVICE INFORMATION
        AX = 4400h
        BX = handle
Return: CF clear if successful
            DX = device information word (see below)
            AX destroyed
        CF set on error
            AX = error code (01h,05h,06h) (see AH=59h)
Notes:  value in DH corresponds to high byte of device driver's attribute word
          if handle refers to a character device
        Novell NetWare reportedly does not return a drive number in bits 5-0
          for a disk file
SeeAlso: AX=4401h,INT 2F/AX=122Bh

Bitfields for device information word:
 character device
  bit 14: device driver can process IOCTL requests (see AX=4402h)
  bit 13: output until busy supported
  bit 11: driver supports OPEN/CLOSE calls
  bit  7: set (indicates device)
  bit  6: EOF on input
  bit  5: raw (binary) mode
  bit  4: device is special (uses INT 29)
  bit  3: clock device
  bit  2: NUL device
  bit  1: standard output
  bit  0: standard input
 disk file
  bit 15: file is remote (DOS 3+)
  bit 14: don't set file date/time on closing (DOS 3+)
  bit 11: media not removable
  bit  8: (DOS 4 only) generate INT 24 if no disk space on write or read past
                end of file
  bit  7: clear (indicates file)
  bit  6: file has not been written
  bits 5-0: drive number (0 = A:)

So the first test rg.dl and 128=0 is true if the handle points to a file.
The second test is to check if the device is standard input/output.

Osmo



Tue, 22 Jul 2003 06:12:43 GMT  
 
 [ 2 post ] 

 Relevant Pages 

1. Strange problem when running a report

2. MS SQL Server Strange Problem

3. Strange problem with TQuery !

4. Strange problem with QRCompositereport.

5. Strange problem with TQuery

6. Strange problem with cached updates

7. Strange Problem

8. Access, Delphi3 (BDE4.51) and a strange problem...

9. Strange problem with DOS under Win98.

10. Strange problem with Upcase and comparing instr.

11. Strange problem with Upcase and comparing instr.

12. Strange Problem - Please Help!

 

 
Powered by phpBB® Forum Software