OSDN Git Service

2007-03-09 Jerry DeLisle <jvdelisle@gcc.gnu.org>
authorjvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 9 Mar 2007 21:51:39 +0000 (21:51 +0000)
committerjvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 9 Mar 2007 21:51:39 +0000 (21:51 +0000)
PR libgfortran/31099
* io/open.c (new_unit): Initialize bytes_left and recl_subrecord.
* io/transfer.c (next_record_w): Set bytes left to record length for
sequential unformatted I/O.
(next_record_r): Ditto.
(read_block_direct): Fix test for exceeding bytes_left.

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

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

index 889a70d..7f90658 100644 (file)
@@ -1,3 +1,12 @@
+2007-03-09  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+
+       PR libgfortran/31099
+       * io/open.c (new_unit): Initialize bytes_left and recl_subrecord.
+       * io/transfer.c (next_record_w): Set bytes left to record length for
+       sequential unformatted I/O.
+       (next_record_r): Ditto.
+       (read_block_direct): Fix test for exceeding bytes_left.
+
 2007-03-08  Daniel Franke  <franke.daniel@gmail.com>
 
        PR fortran/30947
index ef1ce1e..783c5e8 100644 (file)
@@ -437,6 +437,8 @@ new_unit (st_parameter_open *opp, gfc_unit *u, unit_flags * flags)
     {
       u->flags.has_recl = 1;
       u->recl = opp->recl_in;
+      u->recl_subrecord = u->recl;
+      u->bytes_left = u->recl;
     }
   else
     {
index a7632da..42f8249 100644 (file)
@@ -434,11 +434,10 @@ read_block_direct (st_parameter_dt *dtp, void *buf, size_t *nbytes)
 
   /* Check whether we exceed the total record length.  */
 
-  if (dtp->u.p.current_unit->flags.has_recl)
+  if (dtp->u.p.current_unit->flags.has_recl
+      && (*nbytes > (size_t) dtp->u.p.current_unit->bytes_left))
     {
-      to_read_record =
-       *nbytes > (size_t) dtp->u.p.current_unit->bytes_left ?
-       *nbytes : (size_t) dtp->u.p.current_unit->bytes_left;
+      to_read_record = (size_t) dtp->u.p.current_unit->bytes_left;
       short_record = 1;
     }
   else
@@ -2152,6 +2151,7 @@ next_record_r (st_parameter_dt *dtp)
     
     case UNFORMATTED_SEQUENTIAL:
       next_record_r_unf (dtp, 1);
+      dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
       break;
 
     case FORMATTED_DIRECT:
@@ -2377,6 +2377,7 @@ next_record_w (st_parameter_dt *dtp, int done)
 
     case UNFORMATTED_SEQUENTIAL:
       next_record_w_unf (dtp, 0);
+      dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
       break;
 
     case FORMATTED_STREAM: