comp.lang.ada
 help / color / mirror / Atom feed
From: Adam Beneschan <adam@irvine.com>
Subject: Re: C getchar() functionality in Ada
Date: Mon, 16 Feb 2009 15:46:22 -0800 (PST)
Date: 2009-02-16T15:46:22-08:00	[thread overview]
Message-ID: <f189b0f2-1e0a-43bc-af88-394374723278@r41g2000prr.googlegroups.com> (raw)
In-Reply-To: 4999ce31$0$90266$14726298@news.sunsite.dk

On Feb 16, 12:36 pm, Thomas Locke <tho...@kenshi.dk> wrote:
> Hey all,
>
> I've started redoing all the K&R C examples in Ada, and I've already hit
> a wall that I'm not able to get around.
>
> I have this C program:  http://pastebin.com/fbc6bec5
>
> It's very simple, but still I fail to mimick it in Ada.
>
> The C program happily accepts everything I throw at it, and it responds
> with the expected values, whereas my Ada version(s) either fail at
> linefeeds, throw End_Error exceptions at me, or spits out too many
> linefeeds!
>
> My current Ada code looks like this:http://pastebin.com/f519f7e37
>
> This version works with input from keyboard and when I pipe some data
> into it like this:  $ echo "FooBar" | ito
>
> It craps out on files ($ cat SomeFile | ito), where it ignores linefeeds
> and throws End_Error exceptions at me when the last character in the
> file is a linefeed

I'd be surprised if the program actually ignores *all* linefeeds---
that would indicate something is wrong with your compiler.  But you're
probably  seeing that blank lines get ignored---is that correct?

Ada doesn't think of Text_IO files just as streams of characters (with
linefeed being one of the characters); files are structured in terms
of lines and pages, without specifying just what form the line
separators and page separators look like.  Here, End_Of_Line tests to
see if the input file is at the end of the line, but it does *not*
"eat" the line separator.  You'll have to use Skip_Line for that.
Also, Get will skip over any line separators that it's facing.  So if
there are two or more line separators in a row, End_Of_Line will not
swallow any of them, and then Get will swallow all of them.
Furthermore, if there are multiple line separators followed by the end-
of-file, End_Of_File will not return True because there are additional
"empty" lines, but then Get will eat all the line separators and then
raise End_Error because there is no character to read.

I think that with this information you can probably figure out how to
make it work, as close as possible.  But keep in mind that you are
*still* not going to be reading and writing individual characters the
same as in C.  On Windows, the line separator is often CR LF (two
characters), and there's really no way in Ada (using Text_IO) to treat
that as two separate characters.  If you need that, you'll have to go
outside the standard Ada library.  Plus there's no telling what your
implementation will do if it sees CR or LF by itself, or LF CR, or
other mutant combinations of those control characters.

In any event, the program you're writing probably has no practical
use.  If you really want to read individual characters and treat
control characters just like all other characters, you probably don't
want to use Text_IO.  If that isn't what you want, then you likely
don't want to read individual characters.  I realize that this is not
a practical program that you're trying to mimic, but rather a example
to demonstrate some point.

Hope this helps,

                              -- Adam





  parent reply	other threads:[~2009-02-16 23:46 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-02-16 20:36 C getchar() functionality in Ada Thomas Locke
2009-02-16 21:43 ` Jeffrey R. Carter
2009-02-17  7:23   ` Thomas Locke
2009-02-17  8:16     ` Niklas Holsti
2009-02-17 13:01       ` Georg Bauhaus
2009-02-17 22:03         ` Thomas Locke
2009-03-03  8:57         ` David Thompson
2009-02-17 20:48     ` Jeffrey R. Carter
2009-02-17 21:59       ` Thomas Locke
2009-02-16 23:46 ` Adam Beneschan [this message]
2009-02-17  7:19   ` Thomas Locke
2009-02-17  8:37     ` Jacob Sparre Andersen
2009-02-17 17:31       ` Keith Thompson
2009-02-17 14:57     ` Hibou57 (Yannick Duchêne)
2009-02-17 14:55   ` Hibou57 (Yannick Duchêne)
2009-02-17 10:37 ` m.collado
2009-02-17 22:07   ` Thomas Locke
2009-02-17 16:40 ` Jean-Pierre Rosen
2009-02-17 19:46   ` Thomas Locke
2009-02-17 20:24     ` Hyman Rosen
2009-02-17 23:44       ` Robert A Duff
2009-02-18  5:44         ` anon
2009-02-18  0:39       ` Adam Beneschan
2009-02-18  7:43     ` Jean-Pierre Rosen
2009-02-18 11:42       ` christoph.grein
2009-02-17 20:38   ` Jeffrey R. Carter
2009-02-18  7:46     ` Jean-Pierre Rosen
2009-02-18 10:41       ` christoph.grein
replies disabled

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