diff options
author | Janne Blomqvist <jb@gcc.gnu.org> | 2011-02-23 08:59:51 +0200 |
---|---|---|
committer | Janne Blomqvist <jb@gcc.gnu.org> | 2011-02-23 08:59:51 +0200 |
commit | a2c037bdec3daaa6be724b9e93a9087ddfad4f81 (patch) | |
tree | abae9394bf2e2aeea9c461c5aa49689d59efe2d7 | |
parent | ff72e86dfda00631473eca57b8d2af3ef7475c73 (diff) | |
download | gcc-a2c037bdec3daaa6be724b9e93a9087ddfad4f81.zip gcc-a2c037bdec3daaa6be724b9e93a9087ddfad4f81.tar.gz gcc-a2c037bdec3daaa6be724b9e93a9087ddfad4f81.tar.bz2 |
PR 47694 Read from named pipe fails
Co-Authored-By: Jerry DeLisle <jvdelisle@gcc.gnu.org>
From-SVN: r170432
-rw-r--r-- | libgfortran/ChangeLog | 8 | ||||
-rw-r--r-- | libgfortran/io/fbuf.h | 6 | ||||
-rw-r--r-- | libgfortran/io/transfer.c | 36 |
3 files changed, 30 insertions, 20 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 98a1b3f..bed0972 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,11 @@ +2011-02-23 Janne Blomqvist <jb@gcc.gnu.org> + Jerry DeLisle <jvdelisle@gcc.gnu.org> + + PR libfortran/47694 + * io/fbuf.h (fbuf_getptr): New inline function. + * io/transfer.c (read_sf): Use fbuf_getptr and fbuf_getc to scan + through the string instead of fbuf_read. + 2011-02-22 Tobias Burnus <burnus@net-b.de> Kai-Uwe Eckhardt <kuehro@gmx.de> diff --git a/libgfortran/io/fbuf.h b/libgfortran/io/fbuf.h index c82d01b..3a2883b 100644 --- a/libgfortran/io/fbuf.h +++ b/libgfortran/io/fbuf.h @@ -78,4 +78,10 @@ fbuf_getc (gfc_unit * u) return fbuf_getc_refill (u); } +static inline char * +fbuf_getptr (gfc_unit * u) +{ + return (char*) (u->fbuf->buf + u->fbuf->pos); +} + #endif diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c index 8fffe0e..ad5d19d 100644 --- a/libgfortran/io/transfer.c +++ b/libgfortran/io/transfer.c @@ -284,7 +284,8 @@ static char * read_sf (st_parameter_dt *dtp, int * length) { static char *empty_string[0]; - char *base, *p, q; + char *base; + int q, q2; int n, lorig, seen_comma; /* If we have seen an eor previously, return a length of 0. The @@ -301,18 +302,18 @@ read_sf (st_parameter_dt *dtp, int * length) /* Read data into format buffer and scan through it. */ lorig = *length; - base = p = fbuf_read (dtp->u.p.current_unit, length); + base = fbuf_getptr (dtp->u.p.current_unit); if (base == NULL) return NULL; while (n < *length) { - q = *p; - - if (q == '\n' || q == '\r') + q = fbuf_getc (dtp->u.p.current_unit); + if (q == EOF) + break; + else if (q == '\n' || q == '\r') { /* Unexpected end of line. Set the position. */ - fbuf_seek (dtp->u.p.current_unit, n + 1 ,SEEK_CUR); dtp->u.p.sf_seen_eor = 1; /* If we see an EOR during non-advancing I/O, we need to skip @@ -323,15 +324,12 @@ read_sf (st_parameter_dt *dtp, int * length) /* If we encounter a CR, it might be a CRLF. */ if (q == '\r') /* Probably a CRLF */ { - /* See if there is an LF. Use fbuf_read rather then fbuf_getc so - the position is not advanced unless it really is an LF. */ - int readlen = 1; - p = fbuf_read (dtp->u.p.current_unit, &readlen); - if (*p == '\n' && readlen == 1) - { - dtp->u.p.sf_seen_eor = 2; - fbuf_seek (dtp->u.p.current_unit, 1 ,SEEK_CUR); - } + /* See if there is an LF. */ + q2 = fbuf_getc (dtp->u.p.current_unit); + if (q2 == '\n') + dtp->u.p.sf_seen_eor = 2; + else if (q2 != EOF) /* Oops, seek back. */ + fbuf_seek (dtp->u.p.current_unit, -1, SEEK_CUR); } /* Without padding, terminate the I/O statement without assigning @@ -349,20 +347,18 @@ read_sf (st_parameter_dt *dtp, int * length) /* Short circuit the read if a comma is found during numeric input. The flag is set to zero during character reads so that commas in strings are not ignored */ - if (q == ',') + else if (q == ',') if (dtp->u.p.sf_read_comma == 1) { seen_comma = 1; notify_std (&dtp->common, GFC_STD_GNU, "Comma in formatted numeric read."); - *length = n; break; } n++; - p++; - } + } - fbuf_seek (dtp->u.p.current_unit, n + seen_comma, SEEK_CUR); + *length = n; /* A short read implies we hit EOF, unless we hit EOR, a comma, or some other stuff. Set the relevant flags. */ |