mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-11-25 20:03:58 +08:00
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:
parent
75b63e8b5b
commit
beb6a65e75
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user