Make read with <> from a TTY notice EOF
authorJonathan I. Kamens <jik@kamens.brookline.ma.us>
Mon, 12 May 1997 11:47:13 +0000 (07:47 -0400)
committerChip Salzenberg <chip@atlantic.net>
Thu, 15 May 1997 22:15:00 +0000 (10:15 +1200)
The patch I just sent in wasn't quite correct.  I should have tested
it more before sending it :-).  Here's a correct patch.

p5p-msgid: 199705121147.HAA03845@jik.saturn.net

sv.c

diff --git a/sv.c b/sv.c
index 23b5c58..361d626 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -3253,7 +3253,25 @@ screamer2:
             memNE(SvPVX(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
        {
            append = -1;
-           goto screamer2;
+           /*
+             If we're reading from a TTY and we get a short read,
+             indicating that the user hit his EOF character, we need
+             to notice it now, because if we try to read from the TTY
+             again, the EOF condition will disappear.
+
+             The "(cnt == sizeof(buf))" check is an optimization to
+             prevent unnecessary calls to feof().  It seems safe
+             because as far as I can tell, whenever fread() returns a
+             full buffer, right before EOF, it will correctly return
+             0 bytes on the next call, even when reading from a TTY.
+             However, I've only tested this on Linux; other platforms
+             may vary, so it might be easier just to remove the
+             optimization and just check for "! feof(fp)".
+
+               - jik 9/25/96
+           */
+           if ((cnt == sizeof(buf)) || ! PerlIO_eof(fp))
+               goto screamer2;
        }
     }