comp.lang.ada
 help / color / mirror / Atom feed
From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: Get_Line problem (GNAT bug?)
Date: Wed, 6 Dec 2006 22:47:19 +0100
Date: 2006-12-06T22:47:08+01:00	[thread overview]
Message-ID: <1c1gbc5u9cpvp.1wj1zhhn7q86j$.dlg@40tude.net> (raw)
In-Reply-To: el6jss$268$1@cernne03.cern.ch

On Wed, 06 Dec 2006 15:25:31 +0100, Maciej Sobczak wrote:

> Consider:
> 
> with Ada.Text_IO;
> 
> procedure Hello is
>     use Ada.Text_IO;
> 
>     Input_Line : String(1..100);
>     Last_Index : Integer range 0..100;
> begin
>     loop
>        Put("What's your name? ");
>        exit when End_Of_File;
>        Get_Line(Input_Line, Last_Index);
>        if Last_Index >= Input_Line'First then
>           Put("Hi, ");
>           Put(Input_Line(1..Last_Index));
>           New_Line;
>        else
>           Put("You have funny empty name.");
>           New_Line;
>        end if;
>     end loop;
> end Hello;
> 
> (please focus on the Get_Line problem here)
> 
> It should be obvious what the program does, except that the behaviour in 
> the case of empty input line is a bit strange.
> Below, in the right-hand column I describe what keys were pressed:
> 
> $ ./hello
> What's your name? Maciek                -- M a c i e k ENTER
> Hi, Maciek
> What's your name?                       -- ENTER
>                                          -- ENTER
> You have funny empty name.
> What's your name?                       -- ENTER
> You have funny empty name.
> What's your name?                       -- EOF
> $
> 
> As you see, the first ENTER was somehow "swollowed", creating an empty 
> line in the console (that's the echo of what user typed), but still 
> blocking in Get_Line. All subsequent ENTERs seem to be handled 
> correctly, which means that Get_Line returns with Last_Index < 
> Input_Line'First.
> 
> I was already suggested that it might be a GNAT feature. If yes, it 
> seems to be persistent, because I see it with two different versions.
> 
> Of course, I expect that empty lines are handled uniformly.
> 
> Any thoughts?

I think this is a correct behavior. Here is my explanation of what's going
on:

When End_Of_File meets a CR (Ctrl-M) it cannot know if this CR manifests
the end of the current line or both the line end and the file end. This is
because a file can ends with a CR, and this trailing CR is not counted as
an empty line. So eventually End_Of_File should attempt to read the
following character, i.e. block. This is what happens when you start your
program and promptly hit ENTER. When you hit ENTER again, End_Of_File sees,
aha, that CR wasn't the end and unblocks. This lets Get_Line to read the
*first* CR. The second one remains in the buffer. The next round will
block, but this time not on the ENTER you will hit (this would be a third
CR), but on the *second* one. So you will observe what appears a "correct"
behavior, which in fact is "incorrect", because Get_Line gives you the
*previous* empty string. Who cares, all empty strings are empty. (:-)) Now
when entered strings aren't empty everything works because End_Of_File
reacts on the first character of each line and happily returns.

The rules of thumb I suppose I and many other Ada programmers are using:

1. Never ever use End_Of_File with text files;
2. If you yet use End_Of_File then do it for *each* character of the file;
3. As Adam has suggested, End_Error exception is the right design;
4. End_Error is not only cleaner and correct, but also more efficient.

-- 
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de



  parent reply	other threads:[~2006-12-06 21:47 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-12-06 14:25 Get_Line problem (GNAT bug?) Maciej Sobczak
2006-12-06 18:06 ` Adam Beneschan
2006-12-06 20:34 ` Gautier
2006-12-06 21:47 ` Dmitry A. Kazakov [this message]
2006-12-06 23:40   ` Adam Beneschan
2006-12-07  0:02     ` Björn Persson
2006-12-07  1:09       ` Adam Beneschan
2006-12-07  1:28         ` Björn Persson
2006-12-07  5:00         ` Jeffrey R. Carter
2006-12-07  8:26   ` Maciej Sobczak
2006-12-07  9:21     ` Jean-Pierre Rosen
2006-12-07 13:35       ` Ludovic Brenta
2006-12-07 22:23       ` Robert A Duff
2006-12-07 10:22     ` Dmitry A. Kazakov
2006-12-07 14:51       ` Maciej Sobczak
2006-12-07 16:29         ` Dmitry A. Kazakov
2006-12-08  8:22           ` Maciej Sobczak
2006-12-07 22:50       ` Robert A Duff
2006-12-08  0:13         ` Randy Brukardt
2006-12-08  4:04         ` Larry Kilgallen
2006-12-08  9:11         ` Dmitry A. Kazakov
2006-12-07  9:14   ` Jean-Pierre Rosen
2006-12-07  3:34 ` Steve
2006-12-07 17:42   ` Adam Beneschan
2006-12-07 22:35     ` Robert A Duff
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox