+2004-08-21 Bud Davis <bdavis9659@comcast.net>
+
+ PR 16908
+ * gfortran.dg/direct_io.f90: New test.
+
2004-08-20 Mark Mitchell <mark@codesourcery.com>
PR c++/17121
--- /dev/null
+! PR 16908
+! Segfaulted on second set of writes. We weren't handling partial records
+! properly when calculating the file position.
+program direct_io_1
+ implicit none
+
+ integer n, nt, mt, m
+ real dt, tm, w
+ real, allocatable :: p(:)
+
+ nt = 2049 ! if nt < 2049, then everything works.
+
+ allocate(p(nt))
+ p = 0.e0
+
+ inquire(iolength=mt) (p(m), m=1, nt)
+
+ open(unit=12, file='syn.sax', access='direct', recl=mt)
+ n = 1
+ write(12, rec=n) mt, nt
+ write(12, rec=n+1) (p(m), m=1, nt)
+ close(12)
+
+ inquire(iolength=mt) (p(m), m=1, nt)
+
+ open(unit=12, file='syn.sax', access='direct', recl=mt)
+ n = 1
+ write(12, rec=n) mt, nt
+ write(12, rec=n+1) (p(m), m=1, nt)
+ close(12)
+end program
+2004-08-21 Bud Davis <bdavis9659@comcast.net>
+
+ PR 16908
+ * io/transfer.c (next_record_w): Do not blank pad.
+ * io/transfer.c (next_record): Take into account partial records.
+
2004-08-18 Victor Leikehman <lei@il.ibm.com>
PR fortran/13278
switch (current_mode ())
{
case FORMATTED_DIRECT:
- case UNFORMATTED_DIRECT:
if (current_unit->bytes_left == 0)
break;
length = current_unit->bytes_left;
-
p = salloc_w (current_unit->s, &length);
+
if (p == NULL)
goto io_error;
memset (p, ' ', current_unit->bytes_left);
if (sfree (current_unit->s) == FAILURE)
goto io_error;
+ break;
+ case UNFORMATTED_DIRECT:
+ if (sfree (current_unit->s) == FAILURE)
+ goto io_error;
break;
case UNFORMATTED_SEQUENTIAL:
void
next_record (int done)
{
+ gfc_offset fp; /* file position */
current_unit->read_bad = 0;
current_unit->current_record = 0;
if (current_unit->flags.access == ACCESS_DIRECT)
- current_unit->last_record = file_position (current_unit->s)
- / current_unit->recl;
+ {
+ fp = file_position (current_unit->s);
+ /* Calculate next record, rounding up partial records. */
+ current_unit->last_record = (fp + curren_unit->recl - 1)
+ / current_unit->recl;
+ }
else
current_unit->last_record++;