OSDN Git Service

2008-11-15 Jerry DeLisle <jvdelisle@gcc.gnu.org>
authorjvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 15 Nov 2008 19:25:35 +0000 (19:25 +0000)
committerjvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 15 Nov 2008 19:25:35 +0000 (19:25 +0000)
PR libfortran/37294
* io/write.c (namelist_write_newline): Use array loop specification to
advance to next internal array unit record. (namelist_write): Adjust to
accomodate the internal array unit behavior.

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

libgfortran/ChangeLog
libgfortran/io/write.c

index 2903760..42aca0c 100644 (file)
@@ -1,3 +1,10 @@
+2008-11-15  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+
+       PR libfortran/37294
+       * io/write.c (namelist_write_newline): Use array loop specification to
+       advance to next internal array unit record. (namelist_write): Adjust to
+       accomodate the internal array unit behavior.
+
 2008-11-01  Dennis Wassel  <dennis.wassel@gmail.com>
 
        PR fortran/37159
 2008-11-01  Dennis Wassel  <dennis.wassel@gmail.com>
 
        PR fortran/37159
index 12ff295..32c5847 100644 (file)
@@ -1146,6 +1146,35 @@ namelist_write_newline (st_parameter_dt *dtp)
 #else
       write_character (dtp, "\n", 1, 1);
 #endif
 #else
       write_character (dtp, "\n", 1, 1);
 #endif
+      return;
+    }
+
+  if (is_array_io (dtp))
+    {
+      gfc_offset record;
+      int finished, length;
+
+      length = (int) dtp->u.p.current_unit->bytes_left;
+             
+      /* Now that the current record has been padded out,
+        determine where the next record in the array is. */
+      record = next_array_record (dtp, dtp->u.p.current_unit->ls,
+                                 &finished);
+      if (finished)
+       dtp->u.p.current_unit->endfile = AT_ENDFILE;
+      else
+       {
+         /* Now seek to this record */
+         record = record * dtp->u.p.current_unit->recl;
+
+         if (sseek (dtp->u.p.current_unit->s, record) == FAILURE)
+           {
+             generate_error (&dtp->common, LIBERROR_INTERNAL_UNIT, NULL);
+             return;
+           }
+
+         dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
+       }
     }
   else
     write_character (dtp, " ", 1, 1);
     }
   else
     write_character (dtp, " ", 1, 1);
@@ -1467,8 +1496,8 @@ namelist_write (st_parameter_dt *dtp)
        }
     }
 
        }
     }
 
-  write_character (dtp, "  /", 1, 3);
   namelist_write_newline (dtp);
   namelist_write_newline (dtp);
+  write_character (dtp, " /", 1, 2);
   /* Restore the original delimiter.  */
   dtp->u.p.current_unit->delim_status = tmp_delim;
 }
   /* Restore the original delimiter.  */
   dtp->u.p.current_unit->delim_status = tmp_delim;
 }