re PR fortran/29563 (Internal read loses data.)
authorJerry DeLisle <jvdelisle@gcc.gnu.org>
Thu, 26 Oct 2006 04:35:45 +0000 (04:35 +0000)
committerJerry DeLisle <jvdelisle@gcc.gnu.org>
Thu, 26 Oct 2006 04:35:45 +0000 (04:35 +0000)
2006-10-25  Jerry DeLisle  <jvdelisle@gcc.gnu.org>

PR libgfortran/29563
* io/io.h (st_parameter_dt): Add new flag at_eof.
* io/list_read.c (next_char): Set flag when EOF and return '\n' to
signal EOR.  Check flag on next call and jump out.
* io/unit.c (get_internal_unit): Initialize new flag.

From-SVN: r118059

libgfortran/ChangeLog
libgfortran/io/io.h
libgfortran/io/list_read.c
libgfortran/io/unit.c

index 063c62519d361481753a4c085f2d837f8e0f2259..efe39c8d0948c29587a30028b8b8e4f1fe65a778 100644 (file)
@@ -1,3 +1,11 @@
+2006-10-25  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+
+       PR libgfortran/29563
+       * io/io.h (st_parameter_dt): Add new flag at_eof.
+       * io/list_read.c (next_char): Set flag when EOF and return '\n' to
+       signal EOR.  Check flag on next call and jump out.
+       * io/unit.c (get_internal_unit): Initialize new flag.
+
 2006-10-22  Francois-Xavier Coudert  <coudert@clipper.ens.fr>
 
        PR fortran/26025
index ecc4a9de0ea7f6105af9f50d750913b394fbf170..e009f17e3c47e397265ff686c359352beddeccb1 100644 (file)
@@ -415,7 +415,10 @@ typedef struct st_parameter_dt
          /* An internal unit specific flag used to identify that the associated
             unit is internal.  */
          unsigned unit_is_internal : 1;
-         /* 17 unused bits.  */
+         /* An internal unit specific flag to signify an EOF condition for list
+            directed read.  */
+         unsigned at_eof : 1;
+         /* 16 unused bits.  */
 
          char last_char;
          char nml_delim;
index cddfd76877f7637ee228cb14ec1410ef0c82b71f..f10a0997617661838b0f2c777f9d32fb3f22362b 100644 (file)
@@ -163,26 +163,35 @@ next_char (st_parameter_dt *dtp)
        dtp->u.p.line_buffer_enabled = 0;
     }    
 
-  /* Handle the end-of-record condition for internal array unit */
-  if (is_array_io(dtp) && dtp->u.p.current_unit->bytes_left == 0)
+  /* Handle the end-of-record and end-of-file conditions for
+     internal array unit.  */
+  if (is_array_io(dtp))
     {
-      c = '\n';
-      record = next_array_record (dtp, dtp->u.p.current_unit->ls);
-
-      /* Check for "end-of-file" condition */      
-      if (record == 0)
+      if (dtp->u.p.at_eof)
        longjmp (*dtp->u.p.eof_jump, 1);
 
-      record *= dtp->u.p.current_unit->recl;
-      
-      if (sseek (dtp->u.p.current_unit->s, record) == FAILURE)
-       longjmp (*dtp->u.p.eof_jump, 1);
+      /* Check for "end-of-record" condition.  */
+      if (dtp->u.p.current_unit->bytes_left == 0)
+       {
+         record = next_array_record (dtp, dtp->u.p.current_unit->ls);
 
-      dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
-      goto done;
+         /* Check for "end-of-file" condition.  */      
+         if (record == 0)
+           {
+             dtp->u.p.at_eof = 1;
+             c = '\n';
+             goto done;
+           }
+
+         record *= dtp->u.p.current_unit->recl;
+         if (sseek (dtp->u.p.current_unit->s, record) == FAILURE)
+           longjmp (*dtp->u.p.eof_jump, 1);
+
+         dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
+       }
     }
 
-  /* Get the next character and handle end-of-record conditions */
+  /* Get the next character and handle end-of-record conditions */
 
   length = 1;
 
@@ -196,7 +205,7 @@ next_char (st_parameter_dt *dtp)
       if (is_array_io(dtp))
        {
          /* End of record is handled in the next pass through, above.  The
-            check for NULL here is cautionary. */
+            check for NULL here is cautionary.  */
          if (p == NULL)
            {
              generate_error (&dtp->common, ERROR_INTERNAL_UNIT, NULL);
index 6a22784564919298f29e1839a7f3d41752e1e3fd..90e6d85f6dad1a079e392694cd82669acf2e99d9 100644 (file)
@@ -430,6 +430,7 @@ get_internal_unit (st_parameter_dt *dtp)
   dtp->u.p.skips = 0;
   dtp->u.p.pending_spaces = 0;
   dtp->u.p.max_pos = 0;
+  dtp->u.p.at_eof = 0;
 
   /* This flag tells us the unit is assigned to internal I/O.  */