re PR libfortran/25039 ([4.1 only] comma short-circuit field width)

2005-12-08  Jerry DeLisle  <jvdelisle@gcc.gnu.org>

	PR libgfortran/25039
	* io/io.h: Create a new flag sf_read_comma to control comma
	separators in numeric reads.
	* io/transfer.c (formatted_transfer_scalar): Initialize the flag.
	(read_sf): Check for commas coming in and if the flag is set,
	shortcut the read.
	* io/read.c (read_a) (read_x): Clear the flag for character reads and
	reset it after the reads.

From-SVN: r108271
This commit is contained in:
Jerry DeLisle 2005-12-09 02:53:41 +00:00
parent 7691ec4e73
commit b14c7e14ab
4 changed files with 36 additions and 1 deletions

View file

@ -1,3 +1,14 @@
2005-12-08 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR libgfortran/25039
* io/io.h: Create a new flag sf_read_comma to control comma
separators in numeric reads.
* io/transfer.c (formatted_transfer_scalar): Initialize the flag.
(read_sf): Check for commas coming in and if the flag is set,
shortcut the read.
* io/read.c (read_a) (read_x): Clear the flag for character reads and
reset it after the reads.
2005-12-04 Francois-Xavier Coudert <coudert@clipper.ens.fr>
* io/format.c: Removing unused code.

View file

@ -394,7 +394,11 @@ typedef struct st_parameter_dt
to flag read errors and return, so that an attempt can be
made to read a new object name. */
unsigned nml_read_error : 1;
/* 20 unused bits. */
/* A sequential formatted read specific flag used to signal that a
character string is being read so don't use commas to shorten a
formatted field width. */
unsigned sf_read_comma : 1;
/* 19 unused bits. */
char last_char;
char nml_delim;

View file

@ -244,7 +244,9 @@ read_a (st_parameter_dt *dtp, const fnode *f, char *p, int length)
if (w == -1) /* '(A)' edit descriptor */
w = length;
dtp->u.p.sf_read_comma = 0;
source = read_block (dtp, &w);
dtp->u.p.sf_read_comma = 1;
if (source == NULL)
return;
if (w > length)
@ -843,6 +845,9 @@ read_x (st_parameter_dt *dtp, int n)
&& dtp->u.p.current_unit->bytes_left < n)
n = dtp->u.p.current_unit->bytes_left;
dtp->u.p.sf_read_comma = 0;
if (n > 0)
read_block (dtp, &n);
dtp->u.p.sf_read_comma = 1;
}

View file

@ -210,6 +210,16 @@ read_sf (st_parameter_dt *dtp, int *length)
dtp->u.p.sf_seen_eor = (crlf ? 2 : 1);
break;
}
/* 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 == ',')
if (dtp->u.p.sf_read_comma == 1)
{
notify_std (GFC_STD_GNU, "Comma in formatted numeric read.");
*length = n;
break;
}
n++;
*p++ = *q;
@ -527,6 +537,11 @@ formatted_transfer_scalar (st_parameter_dt *dtp, bt type, void *p, int len,
if (dtp->u.p.eor_condition)
return;
/* Set this flag so that commas in reads cause the read to complete before
the entire field has been read. The next read field will start right after
the comma in the stream. (Set to 0 for character reads). */
dtp->u.p.sf_read_comma = 1;
dtp->u.p.line_buffer = scratch;
for (;;)
{