2007-03-25 Jerry DeLisle <jvdelisle@gcc.gnu.org>
authorjvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 26 Mar 2007 03:23:15 +0000 (03:23 +0000)
committerjvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 26 Mar 2007 03:23:15 +0000 (03:23 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@123205 138bc75d-0d04-0410-961f-82ee72b054a4

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

index b0b4f19..6c2d7bb 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 26273d9..ef1a287 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 8c6f9fb..44ff69d 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 77e2ab1..94bda09 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);
 }