summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libgfortran/ChangeLog8
-rw-r--r--libgfortran/io/io.h5
-rw-r--r--libgfortran/io/list_read.c39
-rw-r--r--libgfortran/io/unit.c1
4 files changed, 37 insertions, 16 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index 063c62519d3..efe39c8d094 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,11 @@
+2006-10-25 Jerry DeLisle <jvdelisle@gcc.gnu.org>
+
+ PR libgfortran/29563
+ * io/io.h (st_parameter_dt): Add new flag at_eof.
+ * io/list_read.c (next_char): Set flag when EOF and return '\n' to
+ signal EOR. Check flag on next call and jump out.
+ * io/unit.c (get_internal_unit): Initialize new flag.
+
2006-10-22 Francois-Xavier Coudert <coudert@clipper.ens.fr>
PR fortran/26025
diff --git a/libgfortran/io/io.h b/libgfortran/io/io.h
index ecc4a9de0ea..e009f17e3c4 100644
--- a/libgfortran/io/io.h
+++ b/libgfortran/io/io.h
@@ -415,7 +415,10 @@ typedef struct st_parameter_dt
/* An internal unit specific flag used to identify that the associated
unit is internal. */
unsigned unit_is_internal : 1;
- /* 17 unused bits. */
+ /* An internal unit specific flag to signify an EOF condition for list
+ directed read. */
+ unsigned at_eof : 1;
+ /* 16 unused bits. */
char last_char;
char nml_delim;
diff --git a/libgfortran/io/list_read.c b/libgfortran/io/list_read.c
index cddfd76877f..f10a0997617 100644
--- a/libgfortran/io/list_read.c
+++ b/libgfortran/io/list_read.c
@@ -163,26 +163,35 @@ next_char (st_parameter_dt *dtp)
dtp->u.p.line_buffer_enabled = 0;
}
- /* Handle the end-of-record condition for internal array unit */
- if (is_array_io(dtp) && dtp->u.p.current_unit->bytes_left == 0)
+ /* Handle the end-of-record and end-of-file conditions for
+ internal array unit. */
+ if (is_array_io(dtp))
{
- c = '\n';
- record = next_array_record (dtp, dtp->u.p.current_unit->ls);
-
- /* Check for "end-of-file" condition */
- if (record == 0)
+ if (dtp->u.p.at_eof)
longjmp (*dtp->u.p.eof_jump, 1);
- record *= dtp->u.p.current_unit->recl;
-
- if (sseek (dtp->u.p.current_unit->s, record) == FAILURE)
- longjmp (*dtp->u.p.eof_jump, 1);
+ /* Check for "end-of-record" condition. */
+ if (dtp->u.p.current_unit->bytes_left == 0)
+ {
+ record = next_array_record (dtp, dtp->u.p.current_unit->ls);
- dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
- goto done;
+ /* Check for "end-of-file" condition. */
+ if (record == 0)
+ {
+ dtp->u.p.at_eof = 1;
+ c = '\n';
+ goto done;
+ }
+
+ record *= dtp->u.p.current_unit->recl;
+ if (sseek (dtp->u.p.current_unit->s, record) == FAILURE)
+ longjmp (*dtp->u.p.eof_jump, 1);
+
+ dtp->u.p.current_unit->bytes_left = dtp->u.p.current_unit->recl;
+ }
}
- /* Get the next character and handle end-of-record conditions */
+ /* Get the next character and handle end-of-record conditions. */
length = 1;
@@ -196,7 +205,7 @@ next_char (st_parameter_dt *dtp)
if (is_array_io(dtp))
{
/* End of record is handled in the next pass through, above. The
- check for NULL here is cautionary. */
+ check for NULL here is cautionary. */
if (p == NULL)
{
generate_error (&dtp->common, ERROR_INTERNAL_UNIT, NULL);
diff --git a/libgfortran/io/unit.c b/libgfortran/io/unit.c
index 6a227845649..90e6d85f6da 100644
--- a/libgfortran/io/unit.c
+++ b/libgfortran/io/unit.c
@@ -430,6 +430,7 @@ get_internal_unit (st_parameter_dt *dtp)
dtp->u.p.skips = 0;
dtp->u.p.pending_spaces = 0;
dtp->u.p.max_pos = 0;
+ dtp->u.p.at_eof = 0;
/* This flag tells us the unit is assigned to internal I/O. */