Commit a2c037bd by Janne Blomqvist

PR 47694 Read from named pipe fails

Co-Authored-By: Jerry DeLisle <jvdelisle@gcc.gnu.org>

From-SVN: r170432
parent ff72e86d
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> 2011-02-22 Tobias Burnus <burnus@net-b.de>
Kai-Uwe Eckhardt <kuehro@gmx.de> Kai-Uwe Eckhardt <kuehro@gmx.de>
......
...@@ -78,4 +78,10 @@ fbuf_getc (gfc_unit * u) ...@@ -78,4 +78,10 @@ fbuf_getc (gfc_unit * u)
return fbuf_getc_refill (u); return fbuf_getc_refill (u);
} }
static inline char *
fbuf_getptr (gfc_unit * u)
{
return (char*) (u->fbuf->buf + u->fbuf->pos);
}
#endif #endif
...@@ -284,7 +284,8 @@ static char * ...@@ -284,7 +284,8 @@ static char *
read_sf (st_parameter_dt *dtp, int * length) read_sf (st_parameter_dt *dtp, int * length)
{ {
static char *empty_string[0]; static char *empty_string[0];
char *base, *p, q; char *base;
int q, q2;
int n, lorig, seen_comma; int n, lorig, seen_comma;
/* If we have seen an eor previously, return a length of 0. The /* 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) ...@@ -301,18 +302,18 @@ read_sf (st_parameter_dt *dtp, int * length)
/* Read data into format buffer and scan through it. */ /* Read data into format buffer and scan through it. */
lorig = *length; lorig = *length;
base = p = fbuf_read (dtp->u.p.current_unit, length); base = fbuf_getptr (dtp->u.p.current_unit);
if (base == NULL) if (base == NULL)
return NULL; return NULL;
while (n < *length) while (n < *length)
{ {
q = *p; q = fbuf_getc (dtp->u.p.current_unit);
if (q == EOF)
if (q == '\n' || q == '\r') break;
else if (q == '\n' || q == '\r')
{ {
/* Unexpected end of line. Set the position. */ /* 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; dtp->u.p.sf_seen_eor = 1;
/* If we see an EOR during non-advancing I/O, we need to skip /* 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) ...@@ -323,15 +324,12 @@ read_sf (st_parameter_dt *dtp, int * length)
/* If we encounter a CR, it might be a CRLF. */ /* If we encounter a CR, it might be a CRLF. */
if (q == '\r') /* Probably a CRLF */ if (q == '\r') /* Probably a CRLF */
{ {
/* See if there is an LF. Use fbuf_read rather then fbuf_getc so /* See if there is an LF. */
the position is not advanced unless it really is an LF. */ q2 = fbuf_getc (dtp->u.p.current_unit);
int readlen = 1; if (q2 == '\n')
p = fbuf_read (dtp->u.p.current_unit, &readlen);
if (*p == '\n' && readlen == 1)
{
dtp->u.p.sf_seen_eor = 2; dtp->u.p.sf_seen_eor = 2;
fbuf_seek (dtp->u.p.current_unit, 1 ,SEEK_CUR); 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 /* Without padding, terminate the I/O statement without assigning
...@@ -349,20 +347,18 @@ read_sf (st_parameter_dt *dtp, int * length) ...@@ -349,20 +347,18 @@ read_sf (st_parameter_dt *dtp, int * length)
/* Short circuit the read if a comma is found during numeric input. /* 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 The flag is set to zero during character reads so that commas in
strings are not ignored */ strings are not ignored */
if (q == ',') else if (q == ',')
if (dtp->u.p.sf_read_comma == 1) if (dtp->u.p.sf_read_comma == 1)
{ {
seen_comma = 1; seen_comma = 1;
notify_std (&dtp->common, GFC_STD_GNU, notify_std (&dtp->common, GFC_STD_GNU,
"Comma in formatted numeric read."); "Comma in formatted numeric read.");
*length = n;
break; break;
} }
n++; 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 /* A short read implies we hit EOF, unless we hit EOR, a comma, or
some other stuff. Set the relevant flags. */ some other stuff. Set the relevant flags. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment