Discussion:
How to test if file = Ada.Text_IO.Standard_Input ?
(too old to reply)
reinert
2021-10-23 08:06:38 UTC
Permalink
Hello,

the following program:

procedure test1 (file1 : in Ada.Text_IO.File_Type) is
term1 : constant Boolean := file1 in Ada.Text_IO.Standard_Input;
begin
null;
end test1;

compiles under gnat-10 (debian). The point here is to test if "file1" represents the terminal.

However, when I try to compile using the current GNAT Community Edition from AdaCore, I get the error:

test7.adb:38:41: error: invalid operand types for operator "="
test7.adb:38:41: error: left operand has private type "Ada.Text_Io.File_Type"
test7.adb:38:41: error: right operand has type "Ada.Text_Io.File_Access"
gnatmake: "test7.adb" compilation error

So how can I test if "file1" referes to the terminal using the lastest GNAT Community Edition?

reinert
Jeffrey R.Carter
2021-10-23 10:22:36 UTC
Permalink
Post by reinert
So how can I test if "file1" referes to the terminal using the lastest GNAT Community Edition?
Have you tried

Ada.Text_IO.Name (File1) = Ada.Text_IO.Name (Ada.Text_IO.Standard_Input)

? (I haven't.)
--
Jeff Carter
"C++: The power, elegance and simplicity of a hand grenade."
Ole-Hjalmar Kristensen
90
reinert
2021-10-23 12:28:23 UTC
Permalink
Yes, now it compiles !

reinert
Post by Jeffrey R.Carter
Post by reinert
So how can I test if "file1" referes to the terminal using the lastest GNAT Community Edition?
Have you tried
Ada.Text_IO.Name (File1) = Ada.Text_IO.Name (Ada.Text_IO.Standard_Input)
? (I haven't.)
--
Jeff Carter
"C++: The power, elegance and simplicity of a hand grenade."
Ole-Hjalmar Kristensen
90
Gautier write-only address
2021-10-23 15:40:37 UTC
Permalink
Post by reinert
Yes, now it compiles !
Interesting to see what name GNAT gives to Standard_Input:

with Ada.Text_IO;

procedure SIO is
begin
Ada.Text_IO.Put_Line ('[' & Ada.Text_IO.Name (Ada.Text_IO.Standard_Input) & ']');
Ada.Text_IO.Put_Line ('[' & Ada.Text_IO.Name (Ada.Text_IO.Standard_Error) & ']');
end;

[*stdin]
[*stderr]
Keith Thompson
2021-10-24 20:51:09 UTC
Permalink
Post by Jeffrey R.Carter
Post by reinert
So how can I test if "file1" referes to the terminal using the
lastest GNAT Community Edition?
Have you tried
Ada.Text_IO.Name (File1) = Ada.Text_IO.Name (Ada.Text_IO.Standard_Input)
? (I haven't.)
That might well serve reinert's needs, but strictly speaking it doesn't
tell you whether File1 refers to the terminal. At best it might tell
you whether File1 and Standard_Input refer to the same external file --
which may not even be a terminal if standard input was redirected.

GNAT apparently uses "*stdin" as the Name of Standard_Input, regardless
of what actual file it refers to. There could be an actual file with
that name. It's not likely, but it means that this method could be
broken maliciously.
--
Keith Thompson (The_Other_Keith) Keith.S.Thompson+***@gmail.com
Working, but not speaking, for Philips
void Void(void) { Void(); } /* The recursive call of the void */
Loading...