From 0853054e96b9be76be424b0bdde28a54305fdd60 Mon Sep 17 00:00:00 2001
From: Jerry DeLisle <jvdelisle@gcc.gnu.org>
Date: Sun, 26 Mar 2006 02:15:44 +0000
Subject: [PATCH] re PR libfortran/26661 (Sequential formatted read goes too
 far)

2006-03-25  Jerry DeLisle  <jvdelisle@gcc.gnu.org>

	PR libgfortran/26661
	* io/io.h: Add read_sf so it can be used by read_x.
	* io/transfer.c (read_sf): Pass no_error flag to read_sf.  Use it to
	break out rather than error on EOF or EOR conditions.
	(read_block): Update call to read_sf.
	(read_block_direct): Ditto.
	* io/read.c (read_x): Use the modified read_sf instead of read_block.

From-SVN: r112390
---
 libgfortran/ChangeLog     | 10 ++++++++++
 libgfortran/io/io.h       |  3 +++
 libgfortran/io/read.c     |  2 +-
 libgfortran/io/transfer.c | 12 ++++++++----
 4 files changed, 22 insertions(+), 5 deletions(-)

diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index 136556af07e1..b3786d84c173 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,13 @@
+2006-03-25  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+
+	PR libgfortran/26661
+	* io/io.h: Add read_sf so it can be used by read_x.
+	* io/transfer.c (read_sf): Pass no_error flag to read_sf.  Use it to
+	break out rather than error on EOF or EOR conditions.
+	(read_block): Update call to read_sf.
+	(read_block_direct): Ditto.
+	* io/read.c (read_x): Use the modified read_sf instead of read_block.
+
 2006-03-25  Thomas Koenig  <Thomas.Koenig@online.de>
 
 	PR libfortran/26735
diff --git a/libgfortran/io/io.h b/libgfortran/io/io.h
index e36debbbaeeb..1dd4a00cb649 100644
--- a/libgfortran/io/io.h
+++ b/libgfortran/io/io.h
@@ -743,6 +743,9 @@ internal_proto(type_name);
 extern void *read_block (st_parameter_dt *, int *);
 internal_proto(read_block);
 
+extern char *read_sf (st_parameter_dt *, int *, int);
+internal_proto(read_sf);
+
 extern void *write_block (st_parameter_dt *, int);
 internal_proto(write_block);
 
diff --git a/libgfortran/io/read.c b/libgfortran/io/read.c
index e1e61ee30da5..9db5d583078d 100644
--- a/libgfortran/io/read.c
+++ b/libgfortran/io/read.c
@@ -847,7 +847,7 @@ read_x (st_parameter_dt *dtp, int n)
 
   dtp->u.p.sf_read_comma = 0;
   if (n > 0)
-    read_block (dtp, &n);
+    read_sf (dtp, &n, 1);
   dtp->u.p.sf_read_comma = 1;
 
 }
diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c
index 5f5f32303c9e..a72b4da2b570 100644
--- a/libgfortran/io/transfer.c
+++ b/libgfortran/io/transfer.c
@@ -132,8 +132,8 @@ current_mode (st_parameter_dt *dtp)
    For larger allocations, we are forced to allocate memory on the
    heap.  Hopefully this won't happen very often.  */
 
-static char *
-read_sf (st_parameter_dt *dtp, int *length)
+char *
+read_sf (st_parameter_dt *dtp, int *length, int no_error)
 {
   char *base, *p, *q;
   int n, readlen, crlf;
@@ -171,6 +171,8 @@ read_sf (st_parameter_dt *dtp, int *length)
 	 EOR below.  */
       if (readlen < 1 && n == 0)
 	{
+	  if (no_error)
+	    break;
 	  generate_error (&dtp->common, ERROR_END, NULL);
 	  return NULL;
 	}
@@ -202,6 +204,8 @@ read_sf (st_parameter_dt *dtp, int *length)
 	     so we can just continue with a short read.  */
 	  if (dtp->u.p.current_unit->flags.pad == PAD_NO)
 	    {
+	      if (no_error)
+		break;
 	      generate_error (&dtp->common, ERROR_EOR, NULL);
 	      return NULL;
 	    }
@@ -265,7 +269,7 @@ read_block (st_parameter_dt *dtp, int *length)
 
   if (dtp->u.p.current_unit->flags.form == FORM_FORMATTED &&
       dtp->u.p.current_unit->flags.access == ACCESS_SEQUENTIAL)
-    return read_sf (dtp, length);	/* Special case.  */
+    return read_sf (dtp, length, 0);	/* Special case.  */
 
   dtp->u.p.current_unit->bytes_left -= *length;
 
@@ -315,7 +319,7 @@ read_block_direct (st_parameter_dt *dtp, void *buf, size_t *nbytes)
       dtp->u.p.current_unit->flags.access == ACCESS_SEQUENTIAL)
     {
       length = (int *) nbytes;
-      data = read_sf (dtp, length);	/* Special case.  */
+      data = read_sf (dtp, length, 0);	/* Special case.  */
       memcpy (buf, data, (size_t) *length);
       return;
     }
-- 
GitLab