aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJerry DeLisle <jvdelisle@gcc.gnu.org>2006-10-26 04:35:45 +0000
committerJerry DeLisle <jvdelisle@gcc.gnu.org>2006-10-26 04:35:45 +0000
commit807fb853ee3a10c5ce2f5ed52d3c84ede3dbbd2a (patch)
tree47c5d1a5bbaf45540c19e9a7ef06f27799fc240b
parent7445de0a7b7dceda90638c48bc7933271f3ca5ce (diff)
downloadgcc-807fb853ee3a10c5ce2f5ed52d3c84ede3dbbd2a.zip
gcc-807fb853ee3a10c5ce2f5ed52d3c84ede3dbbd2a.tar.gz
gcc-807fb853ee3a10c5ce2f5ed52d3c84ede3dbbd2a.tar.bz2
re PR fortran/29563 (Internal read loses data.)
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. From-SVN: r118059
-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 063c625..efe39c8 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 ecc4a9d..e009f17 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 cddfd76..f10a099 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 6a22784..90e6d85 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. */