Commit 9a7b6ea7 by Jerry DeLisle

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
parent 46ecc2bc
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.
......
/* 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).
......
/* 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); ...@@ -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);
......
/* 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[] = ...@@ -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) ...@@ -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) ...@@ -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;
......
/* 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) ...@@ -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) ...@@ -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)
......
...@@ -1892,6 +1892,7 @@ is_seekable (stream *s) ...@@ -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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment