From 138469296cf44b816bfc3dac8693b891151fe166 Mon Sep 17 00:00:00 2001 From: Jerry DeLisle Date: Sun, 1 Apr 2007 15:23:48 +0000 Subject: [PATCH] re PR fortran/31366 ([4.2 only] Last record truncated for read after short write, direct access file) 2007-04-01 Jerry DeLisle PR libgfortran/31366 * io/transfer.c (read_block_direct): Do not generate error when reading past EOF on a short record that is less than the RECL= specified. 2007-04-01 Jerry DeLisle PR libgfortran/31207 * io/unit.c (close_unit_1): If there are bytes previously written from ADVANCE="no", move to the end before closing. From-SVN: r123401 --- libgfortran/ChangeLog | 12 ++++++++++++ libgfortran/io/transfer.c | 1 - libgfortran/io/unit.c | 24 ++++++++++++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 6b8f4f89da2..761e5b9a4d2 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,15 @@ +2007-04-01 Jerry DeLisle + + PR libgfortran/31366 + * io/transfer.c (read_block_direct): Do not generate error when reading + past EOF on a short record that is less than the RECL= specified. + +2007-04-01 Jerry DeLisle + + PR libgfortran/31207 + * io/unit.c (close_unit_1): If there are bytes previously written from + ADVANCE="no", move to the end before closing. + 2007-03-31 Francois-Xavier Coudert PR libfortran/31335 diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c index 2555898e112..3c6deb4998c 100644 --- a/libgfortran/io/transfer.c +++ b/libgfortran/io/transfer.c @@ -411,7 +411,6 @@ read_block_direct (st_parameter_dt *dtp, void *buf, size_t *nbytes) /* Short read, e.g. if we hit EOF. Apparently, we read more than was written to the last record. */ *nbytes = to_read_record; - generate_error (&dtp->common, ERROR_SHORT_RECORD, NULL); return; } diff --git a/libgfortran/io/unit.c b/libgfortran/io/unit.c index 90e6d85f6da..2d2c7426cf6 100644 --- a/libgfortran/io/unit.c +++ b/libgfortran/io/unit.c @@ -590,6 +590,30 @@ close_unit_1 (gfc_unit *u, int locked) { int i, rc; + /* If there are previously written bytes from a write with ADVANCE="no" + Reposition the buffer before closing. */ + if (u->saved_pos > 0) + { + char *p; + + p = salloc_w (u->s, &u->saved_pos); + + if (!(u->unit_number == options.stdout_unit + || u->unit_number == options.stderr_unit)) + { + size_t len; + + const char crlf[] = "\r\n"; +#ifdef HAVE_CRLF + len = 2; +#else + len = 1; +#endif + if (swrite (u->s, &crlf[2-len], &len) != 0) + os_error ("Close after ADVANCE_NO failed"); + } + } + rc = (u->s == NULL) ? 0 : sclose (u->s) == FAILURE; u->closed = 1; -- 2.30.2