mirror of git://gcc.gnu.org/git/gcc.git
PR 47694 Read from named pipe fails
Co-Authored-By: Jerry DeLisle <jvdelisle@gcc.gnu.org> From-SVN: r170432
This commit is contained in:
parent
ff72e86dfd
commit
a2c037bdec
|
@ -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>
|
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)
|
||||||
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 *
|
||||||
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)
|
||||||
|
|
||||||
/* 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)
|
||||||
/* 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)
|
||||||
/* 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. */
|
||||||
|
|
Loading…
Reference in New Issue