2008-02-20 Jerry DeLisle <jvdelisle@gcc.gnu.org>
authorjvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 21 Feb 2008 02:27:07 +0000 (02:27 +0000)
committerjvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 21 Feb 2008 02:27:07 +0000 (02:27 +0000)
PR libfortran/35132
* io/transfer.c (next_record_w): Truncate after the last record for
STREAM I/O.

PR libfortran/34954
* io/transfer.c (data_transfer_init): Initialize dtp->rec if writing.

PR libfortran/34974
* io/transfer.c (formatted_transfer_scalar): Flush the buffer if skips
is less than zero. (next_record_w): Use sseek to position the file to
the max position reached.

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

libgfortran/ChangeLog
libgfortran/io/transfer.c

index dcc52a5..7a40198 100644 (file)
@@ -1,5 +1,19 @@
 2008-02-20  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
 
+       PR libfortran/35132
+       * io/transfer.c (next_record_w): Truncate after the last record for
+       STREAM I/O.
+
+       PR libfortran/34954
+       * io/transfer.c (data_transfer_init): Initialize dtp->rec if writing.
+
+       PR libfortran/34974
+       * io/transfer.c (formatted_transfer_scalar): Flush the buffer if skips
+       is less than zero. (next_record_w): Use sseek to position the file to
+       the max position reached.
+
+2008-02-20  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+
        PR libfortran/35036
        * write_float.def (output_float):  Add error checks for zero digits
        after decimal point in E and D format specifiers.
index 52c6314..c3e9114 100644 (file)
@@ -916,8 +916,8 @@ formatted_transfer_scalar (st_parameter_dt *dtp, bt type, void *p, int len,
      the entire field has been read.  The next read field will start right after
      the comma in the stream.  (Set to 0 for character reads).  */
   dtp->u.p.sf_read_comma = 1;
-
   dtp->u.p.line_buffer = scratch;
+
   for (;;)
     {
       /* If reversion has occurred and there is another real data item,
@@ -1274,6 +1274,11 @@ formatted_transfer_scalar (st_parameter_dt *dtp, bt type, void *p, int len,
              else
                read_x (dtp, dtp->u.p.skips);
            }
+         else
+           {
+             if (dtp->u.p.skips < 0)
+               flush (dtp->u.p.current_unit->s);
+           }
 
          break;
 
@@ -2007,6 +2012,8 @@ data_transfer_init (st_parameter_dt *dtp, int read_flag)
        dtp->u.p.current_unit->strm_pos = dtp->rec;
 
     }
+  else
+    dtp->rec = 0;
 
   /* Overwriting an existing sequential file ?
      it is always safe to truncate the file on the first write */
@@ -2583,7 +2590,8 @@ next_record_w (st_parameter_dt *dtp, int done)
          if (max_pos > m)
            {
              length = (int) (max_pos - m);
-             p = salloc_w (dtp->u.p.current_unit->s, &length);
+             sseek (dtp->u.p.current_unit->s,
+                    file_position (dtp->u.p.current_unit->s) + length);
            }
 #ifdef HAVE_CRLF
          len = 2;
@@ -2594,7 +2602,10 @@ next_record_w (st_parameter_dt *dtp, int done)
            goto io_error;
          
          if (is_stream_io (dtp))
-           dtp->u.p.current_unit->strm_pos += len;
+           {
+             dtp->u.p.current_unit->strm_pos += len;
+             struncate(dtp->u.p.current_unit->s);
+           }
        }
 
       break;