diff options
author | jvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-03-26 02:15:44 +0000 |
---|---|---|
committer | jvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-03-26 02:15:44 +0000 |
commit | 32266284b079eed23fae40ce6b61708a909a880a (patch) | |
tree | d9fd16198721c77e9d7670c1d0b9353fc9b6e9c1 /libgfortran | |
parent | 8a64878aeaa54f3dd7dfc13283e10468523f6f00 (diff) | |
download | gcc-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/ChangeLog | 10 | ||||
-rw-r--r-- | libgfortran/io/io.h | 3 | ||||
-rw-r--r-- | libgfortran/io/read.c | 2 | ||||
-rw-r--r-- | libgfortran/io/transfer.c | 12 |
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; } |