re PR fortran/31199 (write with "t1" + nonadvancing transfer format gives wrong output)

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

	PR libgfortran/31199
	*io/io.h: Add saved_pos to gfc_unit structure.
	*io/open.c (new_unit): Initialize saved_pos.
	*io/transfer.c (data_transfer_init): Set max_pos to value in saved_pos.
	(next_record_w): Fix whitespace.
	(finalze_transfer): Calculate max_pos for ADVANCE="no" and save it for
	later use.  If not ADVANCE="no" set saved_pos to zero.

From-SVN: r123205
This commit is contained in:
Jerry DeLisle 2007-03-26 03:23:15 +00:00
parent 75b63e8b5b
commit beb6a65e75
4 changed files with 27 additions and 2 deletions

View File

@ -1,9 +1,22 @@
<<<<<<< .mine
2007-03-23 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR libgfortran/31199
*io/io.h: Add saved_pos to gfc_unit structure.
*io/open.c (new_unit): Initialize saved_pos.
*io/transfer.c (data_transfer_init): Set max_pos to value in saved_pos.
(next_record_w): Fix whitespace.
(finalze_transfer): Calculate max_pos for ADVANCE="no" and save it for
later use. If not ADVANCE="no" set saved_pos to zero.
=======
2007-03-25 Thomas Koenig <tkoenig@gcc.gnu.org> 2007-03-25 Thomas Koenig <tkoenig@gcc.gnu.org>
PR libfortran/31196 PR libfortran/31196
* intrinsics/reshape_generic.c (reshape_internal): Increment * intrinsics/reshape_generic.c (reshape_internal): Increment
correct variable. correct variable.
>>>>>>> .r123204
2007-03-22 Jerry DeLisle <jvdelisle@gcc.gnu.org> 2007-03-22 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR libgfortran/31052 PR libgfortran/31052

View File

@ -443,7 +443,7 @@ typedef struct gfc_unit
struct gfc_unit *left, *right; struct gfc_unit *left, *right;
int priority; int priority;
int read_bad, current_record; int read_bad, current_record, saved_pos;
enum enum
{ NO_ENDFILE, AT_ENDFILE, AFTER_ENDFILE } { NO_ENDFILE, AT_ENDFILE, AFTER_ENDFILE }
endfile; endfile;

View File

@ -423,6 +423,7 @@ new_unit (st_parameter_open *opp, gfc_unit *u, unit_flags * flags)
u->mode = READING; u->mode = READING;
u->maxrec = 0; u->maxrec = 0;
u->bytes_left = 0; u->bytes_left = 0;
u->saved_pos = 0;
if (flags->position == POSITION_APPEND) if (flags->position == POSITION_APPEND)
{ {

View File

@ -1952,6 +1952,10 @@ data_transfer_init (st_parameter_dt *dtp, int read_flag)
dtp->u.p.blank_status = dtp->u.p.current_unit->flags.blank; dtp->u.p.blank_status = dtp->u.p.current_unit->flags.blank;
dtp->u.p.sign_status = SIGN_S; dtp->u.p.sign_status = SIGN_S;
/* Set the maximum position reached from the previous I/O operation. This
could be greater than zero from a previous non-advancing write. */
dtp->u.p.max_pos = dtp->u.p.current_unit->saved_pos;
pre_position (dtp); pre_position (dtp);
/* Set up the subroutine that will handle the transfers. */ /* Set up the subroutine that will handle the transfers. */
@ -2461,7 +2465,6 @@ next_record_w (st_parameter_dt *dtp, int done)
} }
else else
{ {
/* If this is the last call to next_record move to the farthest /* If this is the last call to next_record move to the farthest
position reached in preparation for completing the record. position reached in preparation for completing the record.
(for file unit) */ (for file unit) */
@ -2603,12 +2606,20 @@ finalize_transfer (st_parameter_dt *dtp)
return; return;
} }
/* For non-advancing I/O, save the current maximum position for use in the
next I/O operation if needed. */
if (dtp->u.p.advance_status == ADVANCE_NO) if (dtp->u.p.advance_status == ADVANCE_NO)
{ {
int bytes_written = (int) (dtp->u.p.current_unit->recl
- dtp->u.p.current_unit->bytes_left);
dtp->u.p.current_unit->saved_pos =
dtp->u.p.max_pos > 0 ? dtp->u.p.max_pos - bytes_written : 0;
flush (dtp->u.p.current_unit->s); flush (dtp->u.p.current_unit->s);
return; return;
} }
dtp->u.p.current_unit->saved_pos = 0;
next_record (dtp, 1); next_record (dtp, 1);
sfree (dtp->u.p.current_unit->s); sfree (dtp->u.p.current_unit->s);
} }