From: jb Date: Wed, 23 Feb 2011 06:59:51 +0000 (+0000) Subject: PR 47694 Read from named pipe fails X-Git-Tag: upstream/4.9.2~22611 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7e364f9cf8b41ade77dbfad6595ecd2083f7facf;p=platform%2Fupstream%2Flinaro-gcc.git PR 47694 Read from named pipe fails git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@170432 138bc75d-0d04-0410-961f-82ee72b054a4 --- 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 + Jerry DeLisle + + 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 Kai-Uwe Eckhardt 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. */