diff options
author | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2006-08-15 23:06:44 +0000 |
---|---|---|
committer | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2006-08-15 23:06:44 +0000 |
commit | 91b30ee5b9c83187fe1d7459cbd29abe302d60ed (patch) | |
tree | a00eb1bf11f7cace4d681ea98e21b7e72e529de0 /libgfortran/io/read.c | |
parent | 014ec6ee5fcb77e38dca4a6f272349f4859b03c5 (diff) | |
download | gcc-91b30ee5b9c83187fe1d7459cbd29abe302d60ed.zip gcc-91b30ee5b9c83187fe1d7459cbd29abe302d60ed.tar.gz gcc-91b30ee5b9c83187fe1d7459cbd29abe302d60ed.tar.bz2 |
re PR fortran/25828 ([f2003] ACCESS='STREAM' io support)
2006-08-15 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR libgfortran/25828
* libgfortran.h: Rename GFC_LARGE_IO_INT to GFC_IO_INT.
* io/file_pos.c (st_backspace): Ignore if access=STREAM.
(st_rewind): Handle case of access=STREAM.
* io/open.c (access_opt): Add STREAM_ACCESS.
(edit_modes): Set current_record to zero only if not STREAM.
(new_unit): Initialize maxrec, recl, and last_record for STREAM.
* io/read.c (read_x): Advance file position for STREAM.
* io/io.h (enum unit_access): Align IOPARM flags with frontend.
Add ACCESS_STREAM. Add prototype for is_stream_io () function.
Use GFC_IO_INT.
* io/inquire.c (inquire_via_unit): Add text for access = "STREAM".
* io/unit.c (is_stream_io): New function to return true if access =
STREAM.
* io/transfer.c (file_mode): Add modes for unformatted stream and
formatted stream. (current_mode): Return appropriate file mode based
on access flags.
(read_block): Handle formatted stream reads.
(read_block_direct): Handle unformatted stream reads.
(write_block): Handle formatted stream writes.
(write_buf): Handle unformatted stream writes.
(unformatted_read): Fix up, use temporary for size.
(pre_position): Position file for STREAM access.
(data_transfer_init): Initialize for stream access, skip irrelevent
error checks.
(next_record_r),(next_record_w), and (next_record): Do nothing for
stream I/O.
(finalize_transfer): Flush when all done if stream I/O.
From-SVN: r116172
Diffstat (limited to 'libgfortran/io/read.c')
-rw-r--r-- | libgfortran/io/read.c | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/libgfortran/io/read.c b/libgfortran/io/read.c index 9db5d58..db9ff99 100644 --- a/libgfortran/io/read.c +++ b/libgfortran/io/read.c @@ -841,13 +841,17 @@ read_f (st_parameter_dt *dtp, const fnode *f, char *dest, int length) void read_x (st_parameter_dt *dtp, int n) { - if ((dtp->u.p.current_unit->flags.pad == PAD_NO || is_internal_unit (dtp)) - && dtp->u.p.current_unit->bytes_left < n) - n = dtp->u.p.current_unit->bytes_left; - - dtp->u.p.sf_read_comma = 0; - if (n > 0) - read_sf (dtp, &n, 1); - dtp->u.p.sf_read_comma = 1; - + if (!is_stream_io (dtp)) + { + if ((dtp->u.p.current_unit->flags.pad == PAD_NO || is_internal_unit (dtp)) + && dtp->u.p.current_unit->bytes_left < n) + n = dtp->u.p.current_unit->bytes_left; + + dtp->u.p.sf_read_comma = 0; + if (n > 0) + read_sf (dtp, &n, 1); + dtp->u.p.sf_read_comma = 1; + } + else + dtp->rec += (GFC_IO_INT) n; } |