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:
parent
7691ec4e73
commit
b14c7e14ab
4 changed files with 36 additions and 1 deletions
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
}
|
||||
|
|
|
@ -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 (;;)
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue