From 153ce7a78edbe339fa0b1cd314dea0554f59faf0 Mon Sep 17 00:00:00 2001 From: Jerry DeLisle <jvdelisle@gcc.gnu.org> Date: Mon, 12 Feb 2024 13:12:08 -0800 Subject: [PATCH] libgfortran: Adjust bytes_left and pos for access="STREAM". During tab edits, the pos (position) and bytes_used Variables were not being set correctly for stream I/O. Since stream I/O does not have 'real' records, the format buffer active length must be used instead of the record length variable. PR libgfortran/109358 libgfortran/ChangeLog: * io/transfer.c (formatted_transfer_scalar_write): Adjust bytes_used and pos variable for stream access. gcc/testsuite/ChangeLog: * gfortran.dg/pr109358.f90: New test. --- gcc/testsuite/gfortran.dg/pr109358.f90 | 14 ++++++++++++++ libgfortran/io/transfer.c | 14 +++++++++----- 2 files changed, 23 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/pr109358.f90 diff --git a/gcc/testsuite/gfortran.dg/pr109358.f90 b/gcc/testsuite/gfortran.dg/pr109358.f90 new file mode 100644 index 000000000000..5013984095b1 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr109358.f90 @@ -0,0 +1,14 @@ +! { dg-do run } +! PR109358, test that tabs during stream io are correct. +program tabs + implicit none + integer :: fd + character(64) :: line + open(newunit=fd, file="otabs.txt", form="formatted", access="stream") + write(fd, "(i4, t40, i4, t20, i5.5)") 1234, 5555, 67890 + close(fd) + open(newunit=fd, file="otabs.txt", form="formatted") + read(fd,"(a)") line + close(fd, status='delete') + if (line .ne. "1234 67890 5555") stop 10 +end program tabs diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c index 80b60dfeb9f8..99ef96a9e7c8 100644 --- a/libgfortran/io/transfer.c +++ b/libgfortran/io/transfer.c @@ -2072,11 +2072,11 @@ formatted_transfer_scalar_write (st_parameter_dt *dtp, bt type, void *p, int kin dtp->u.p.skips = dtp->u.p.pending_spaces = 0; } - bytes_used = dtp->u.p.current_unit->recl - - dtp->u.p.current_unit->bytes_left; - if (is_stream_io(dtp)) - bytes_used = 0; + bytes_used = dtp->u.p.current_unit->fbuf->act; + else + bytes_used = dtp->u.p.current_unit->recl + - dtp->u.p.current_unit->bytes_left; switch (t) { @@ -2452,7 +2452,11 @@ formatted_transfer_scalar_write (st_parameter_dt *dtp, bt type, void *p, int kin p = ((char *) p) + size; } - pos = dtp->u.p.current_unit->recl - dtp->u.p.current_unit->bytes_left; + if (is_stream_io(dtp)) + pos = dtp->u.p.current_unit->fbuf->act; + else + pos = dtp->u.p.current_unit->recl - dtp->u.p.current_unit->bytes_left; + dtp->u.p.max_pos = (dtp->u.p.max_pos > pos) ? dtp->u.p.max_pos : pos; } -- GitLab