re PR fortran/31199 (write with "t1" + nonadvancing transfer format gives wrong output)
authorJerry DeLisle <jvdelisle@gcc.gnu.org>
Mon, 26 Mar 2007 03:23:15 +0000 (03:23 +0000)
committerJerry DeLisle <jvdelisle@gcc.gnu.org>
Mon, 26 Mar 2007 03:23:15 +0000 (03:23 +0000)
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

libgfortran/ChangeLog
libgfortran/io/io.h
libgfortran/io/open.c
libgfortran/io/transfer.c

index b0b4f19aa99f2608cd170cd48175f43dd7fa0d32..6c2d7bbd5e45d5747f48298891c35ffdddf5a251 100644 (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>
 
        PR libfortran/31196
        * intrinsics/reshape_generic.c (reshape_internal):  Increment
        correct variable.
 
+>>>>>>> .r123204
 2007-03-22  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
 
        PR libgfortran/31052
index 26273d9018e80aee1d22a717f36180ed8d02c014..ef1a287a184ac5131de8a9bced9624110a2013f4 100644 (file)
@@ -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;
index 8c6f9fb06188428f3587c55d19f2886c23f97b62..44ff69d68dbff671292653b46eac30bf45ef041f 100644 (file)
@@ -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)
     {
index 77e2ab1344a50a441b6f5322d2e34ec87fb3a148..94bda09587bf7058b4c178da253df284608e464d 100644 (file)
@@ -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);
 }