aboutsummaryrefslogtreecommitdiff
path: root/libgfortran/io
diff options
context:
space:
mode:
authorJerry DeLisle <jvdelisle@gcc.gnu.org>2014-05-24 19:26:02 +0000
committerJerry DeLisle <jvdelisle@gcc.gnu.org>2014-05-24 19:26:02 +0000
commit03c0f1952048ea3c781bba93d81afcf2519a49f2 (patch)
treeaf89e009992f855776a49c47ce4bd0fb173a37a0 /libgfortran/io
parent63cbc2d48f9b76d3dc4eb6b9abdd063087db8653 (diff)
downloadgcc-03c0f1952048ea3c781bba93d81afcf2519a49f2.zip
gcc-03c0f1952048ea3c781bba93d81afcf2519a49f2.tar.gz
gcc-03c0f1952048ea3c781bba93d81afcf2519a49f2.tar.bz2
re PR libfortran/61173 (Erroneous "end of file" with internal read)
2014-05-23 Jerry DeLisle <jvdelisle@gcc.gnu> PR libfortran/61173 * io/list_read.c (eat_spaces): If the next character pointed to is a space, don't seek, must be at the end. From-SVN: r210898
Diffstat (limited to 'libgfortran/io')
-rw-r--r--libgfortran/io/list_read.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/libgfortran/io/list_read.c b/libgfortran/io/list_read.c
index 885db4a..5ccd022 100644
--- a/libgfortran/io/list_read.c
+++ b/libgfortran/io/list_read.c
@@ -398,7 +398,7 @@ eat_spaces (st_parameter_dt *dtp)
if (is_array_io (dtp))
{
gfc_offset offset = stell (dtp->u.p.current_unit->s);
- gfc_offset limit = dtp->u.p.current_unit->bytes_left;
+ gfc_offset limit = offset + dtp->u.p.current_unit->bytes_left;
if (dtp->common.unit) /* kind=4 */
{
@@ -410,13 +410,15 @@ eat_spaces (st_parameter_dt *dtp)
offset += (sizeof (gfc_char4_t));
dtp->u.p.current_unit->bytes_left--;
}
- while (offset < limit && (cc == (gfc_char4_t)' '
- || cc == (gfc_char4_t)'\t'));
+ while (offset < limit && cc == (gfc_char4_t)' ');
/* Back up, seek ahead, and fall through to complete the
process so that END conditions are handled correctly. */
dtp->u.p.current_unit->bytes_left++;
- sseek (dtp->u.p.current_unit->s,
- offset-(sizeof (gfc_char4_t)), SEEK_SET);
+
+ cc = dtp->internal_unit[offset];
+ if (cc != (gfc_char4_t)' ')
+ sseek (dtp->u.p.current_unit->s,
+ offset-(sizeof (gfc_char4_t)), SEEK_SET);
}
else
{
@@ -425,11 +427,13 @@ eat_spaces (st_parameter_dt *dtp)
c = dtp->internal_unit[offset++];
dtp->u.p.current_unit->bytes_left--;
}
- while (offset < limit && (c == ' ' || c == '\t'));
+ while (offset < limit && c == ' ');
/* Back up, seek ahead, and fall through to complete the
process so that END conditions are handled correctly. */
dtp->u.p.current_unit->bytes_left++;
- sseek (dtp->u.p.current_unit->s, offset-1, SEEK_SET);
+
+ if (dtp->internal_unit[offset] != ' ')
+ sseek (dtp->u.p.current_unit->s, offset - 1, SEEK_SET);
}
}
/* Now skip spaces, EOF and EOL are handled in next_char. */