+2006-03-25 Jerry DeLisle <jvdelisle@gcc.gnu.org>
+
+ PR libgfortran/26661
+ * io/io.h: Add read_sf so it can be used by read_x.
+ * io/transfer.c (read_sf): Pass no_error flag to read_sf. Use it to
+ break out rather than error on EOF or EOR conditions.
+ (read_block): Update call to read_sf.
+ (read_block_direct): Ditto.
+ * io/read.c (read_x): Use the modified read_sf instead of read_block.
+
2006-03-25 Thomas Koenig <Thomas.Koenig@online.de>
PR libfortran/26735
extern void *read_block (st_parameter_dt *, int *);
internal_proto(read_block);
+extern char *read_sf (st_parameter_dt *, int *, int);
+internal_proto(read_sf);
+
extern void *write_block (st_parameter_dt *, int);
internal_proto(write_block);
For larger allocations, we are forced to allocate memory on the
heap. Hopefully this won't happen very often. */
-static char *
-read_sf (st_parameter_dt *dtp, int *length)
+char *
+read_sf (st_parameter_dt *dtp, int *length, int no_error)
{
char *base, *p, *q;
int n, readlen, crlf;
EOR below. */
if (readlen < 1 && n == 0)
{
+ if (no_error)
+ break;
generate_error (&dtp->common, ERROR_END, NULL);
return NULL;
}
so we can just continue with a short read. */
if (dtp->u.p.current_unit->flags.pad == PAD_NO)
{
+ if (no_error)
+ break;
generate_error (&dtp->common, ERROR_EOR, NULL);
return NULL;
}
if (dtp->u.p.current_unit->flags.form == FORM_FORMATTED &&
dtp->u.p.current_unit->flags.access == ACCESS_SEQUENTIAL)
- return read_sf (dtp, length); /* Special case. */
+ return read_sf (dtp, length, 0); /* Special case. */
dtp->u.p.current_unit->bytes_left -= *length;
dtp->u.p.current_unit->flags.access == ACCESS_SEQUENTIAL)
{
length = (int *) nbytes;
- data = read_sf (dtp, length); /* Special case. */
+ data = read_sf (dtp, length, 0); /* Special case. */
memcpy (buf, data, (size_t) *length);
return;
}