summaryrefslogtreecommitdiff
path: root/libgfortran
diff options
context:
space:
mode:
authorjvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4>2006-03-26 02:15:44 +0000
committerjvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4>2006-03-26 02:15:44 +0000
commit32266284b079eed23fae40ce6b61708a909a880a (patch)
treed9fd16198721c77e9d7670c1d0b9353fc9b6e9c1 /libgfortran
parent8a64878aeaa54f3dd7dfc13283e10468523f6f00 (diff)
downloadgcc-32266284b079eed23fae40ce6b61708a909a880a.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@112390 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libgfortran')
-rw-r--r--libgfortran/ChangeLog10
-rw-r--r--libgfortran/io/io.h3
-rw-r--r--libgfortran/io/read.c2
-rw-r--r--libgfortran/io/transfer.c12
4 files changed, 22 insertions, 5 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index 136556af07e..b3786d84c17 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 e36debbbaee..1dd4a00cb64 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 e1e61ee30da..9db5d583078 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 5f5f32303c9..a72b4da2b57 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;
}