diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index b0b4f19aa99..6c2d7bbd5e4 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,9 +1,22 @@ +<<<<<<< .mine +2007-03-23 Jerry DeLisle + + 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 PR libfortran/31196 * intrinsics/reshape_generic.c (reshape_internal): Increment correct variable. +>>>>>>> .r123204 2007-03-22 Jerry DeLisle PR libgfortran/31052 diff --git a/libgfortran/io/io.h b/libgfortran/io/io.h index 26273d9018e..ef1a287a184 100644 --- a/libgfortran/io/io.h +++ b/libgfortran/io/io.h @@ -443,7 +443,7 @@ typedef struct gfc_unit struct gfc_unit *left, *right; int priority; - int read_bad, current_record; + int read_bad, current_record, saved_pos; enum { NO_ENDFILE, AT_ENDFILE, AFTER_ENDFILE } endfile; diff --git a/libgfortran/io/open.c b/libgfortran/io/open.c index 8c6f9fb0618..44ff69d68db 100644 --- a/libgfortran/io/open.c +++ b/libgfortran/io/open.c @@ -423,6 +423,7 @@ new_unit (st_parameter_open *opp, gfc_unit *u, unit_flags * flags) u->mode = READING; u->maxrec = 0; u->bytes_left = 0; + u->saved_pos = 0; if (flags->position == POSITION_APPEND) { diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c index 77e2ab1344a..94bda09587b 100644 --- a/libgfortran/io/transfer.c +++ b/libgfortran/io/transfer.c @@ -1951,6 +1951,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.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); @@ -2461,7 +2465,6 @@ next_record_w (st_parameter_dt *dtp, int done) } else { - /* If this is the last call to next_record move to the farthest position reached in preparation for completing the record. (for file unit) */ @@ -2603,12 +2606,20 @@ finalize_transfer (st_parameter_dt *dtp) 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) { + 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); return; } + dtp->u.p.current_unit->saved_pos = 0; + next_record (dtp, 1); sfree (dtp->u.p.current_unit->s); }