re PR libfortran/31052 ([4.2 only] Bad IOSTAT values when readings NAMELISTs past EOF)

2007-03-22  Jerry DeLisle  <jvdelisle@gcc.gnu.org>

	PR libgfortran/31052
	* file_pos.c: Update Copyright year.
	* io/open.c (test_endfile): Restore test_endfile to fix SPEC regression.
	Update Copyright year.
	* io/io.h: Same.
	* io/unix.c (is_special): Add missing type for this function.
	Update Copyright year.
	* io/transfer.c (next_record_r): Restore test_endfile.
	(st_read): Fix whitespace.  Update Copyright year

From-SVN: r123139
This commit is contained in:
Jerry DeLisle 2007-03-23 00:13:19 +00:00
parent 46ecc2bc5c
commit 9a7b6ea727
6 changed files with 48 additions and 5 deletions

View File

@ -1,3 +1,15 @@
2007-03-22 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR libgfortran/31052
* file_pos.c: Update Copyright year.
* io/open.c (test_endfile): Restore test_endfile to fix SPEC regression.
Update Copyright year.
* io/io.h: Same.
* io/unix.c (is_special): Add missing type for this function.
Update Copyright year.
* io/transfer.c (next_record_r): Restore test_endfile.
(st_read): Fix whitespace. Update Copyright year
2007-03-20 Francois-Xavier Coudert <coudert@clipper.ens.fr> 2007-03-20 Francois-Xavier Coudert <coudert@clipper.ens.fr>
* configure.ac: Add missing check for gettimeofday. * configure.ac: Add missing check for gettimeofday.

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2002-2003, 2005, 2006 Free Software Foundation, Inc. /* Copyright (C) 2002-2003, 2005, 2006, 2007 Free Software Foundation, Inc.
Contributed by Andy Vaught and Janne Blomqvist Contributed by Andy Vaught and Janne Blomqvist
This file is part of the GNU Fortran runtime library (libgfortran). This file is part of the GNU Fortran runtime library (libgfortran).

View File

@ -1,4 +1,5 @@
/* Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. /* Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007
Free Software Foundation, Inc.
Contributed by Andy Vaught Contributed by Andy Vaught
This file is part of the GNU Fortran 95 runtime library (libgfortran). This file is part of the GNU Fortran 95 runtime library (libgfortran).
@ -694,6 +695,9 @@ internal_proto(unlock_unit);
/* open.c */ /* open.c */
extern void test_endfile (gfc_unit *);
internal_proto(test_endfile);
extern gfc_unit *new_unit (st_parameter_open *, gfc_unit *, unit_flags *); extern gfc_unit *new_unit (st_parameter_open *, gfc_unit *, unit_flags *);
internal_proto(new_unit); internal_proto(new_unit);

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2002, 2003, 2004, 2005 /* Copyright (C) 2002, 2003, 2004, 2005, 2007
Free Software Foundation, Inc. Free Software Foundation, Inc.
Contributed by Andy Vaught Contributed by Andy Vaught
@ -109,6 +109,19 @@ static const st_option convert_opt[] =
{ NULL, 0} { NULL, 0}
}; };
/* Given a unit, test to see if the file is positioned at the terminal
point, and if so, change state from NO_ENDFILE flag to AT_ENDFILE.
This prevents us from changing the state from AFTER_ENDFILE to
AT_ENDFILE. */
void
test_endfile (gfc_unit * u)
{
if (u->endfile == NO_ENDFILE && file_length (u->s) == file_position (u->s))
u->endfile = AT_ENDFILE;
}
/* Change the modes of a file, those that are allowed * to be /* Change the modes of a file, those that are allowed * to be
changed. */ changed. */
@ -195,6 +208,8 @@ edit_modes (st_parameter_open *opp, gfc_unit * u, unit_flags * flags)
u->current_record = 0; u->current_record = 0;
u->last_record = 0; u->last_record = 0;
test_endfile (u); /* We might be at the end. */
break; break;
case POSITION_APPEND: case POSITION_APPEND:
@ -471,6 +486,13 @@ new_unit (st_parameter_open *opp, gfc_unit *u, unit_flags * flags)
memmove (u->file, opp->file, opp->file_len); memmove (u->file, opp->file, opp->file_len);
u->file_len = opp->file_len; u->file_len = opp->file_len;
/* Curiously, the standard requires that the
position specifier be ignored for new files so a newly connected
file starts out at the initial point. We still need to figure
out if the file is at the end or not. */
test_endfile (u);
if (flags->status == STATUS_SCRATCH && opp->file != NULL) if (flags->status == STATUS_SCRATCH && opp->file != NULL)
free_mem (opp->file); free_mem (opp->file);
return u; return u;

View File

@ -1,4 +1,5 @@
/* Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. /* Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007
Free Software Foundation, Inc.
Contributed by Andy Vaught Contributed by Andy Vaught
Namelist transfer functions contributed by Paul Thomas Namelist transfer functions contributed by Paul Thomas
@ -2222,6 +2223,9 @@ next_record_r (st_parameter_dt *dtp)
break; break;
} }
if (dtp->u.p.current_unit->flags.access == ACCESS_SEQUENTIAL)
test_endfile (dtp->u.p.current_unit);
} }
@ -2681,7 +2685,7 @@ st_read (st_parameter_dt *dtp)
data_transfer_init (dtp, 1); data_transfer_init (dtp, 1);
/* Handle complications dealing with the endfile record. */ /* Handle complications dealing with the endfile record. */
if (dtp->u.p.current_unit->flags.access == ACCESS_SEQUENTIAL) if (dtp->u.p.current_unit->flags.access == ACCESS_SEQUENTIAL)
switch (dtp->u.p.current_unit->endfile) switch (dtp->u.p.current_unit->endfile)

View File

@ -1892,6 +1892,7 @@ is_seekable (stream *s)
/* is_special()-- Return nonzero if the stream is not a regular file. */ /* is_special()-- Return nonzero if the stream is not a regular file. */
int
is_special (stream *s) is_special (stream *s)
{ {
return ((unix_stream *) s)->special_file; return ((unix_stream *) s)->special_file;