From b14c7e14ab82a292a7813f223f56dc2585cda238 Mon Sep 17 00:00:00 2001 From: Jerry DeLisle Date: Fri, 9 Dec 2005 02:53:41 +0000 Subject: re PR libfortran/25039 ([4.1 only] comma short-circuit field width) 2005-12-08 Jerry DeLisle 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 --- libgfortran/io/io.h | 6 +++++- libgfortran/io/read.c | 5 +++++ libgfortran/io/transfer.c | 15 +++++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) (limited to 'libgfortran/io') diff --git a/libgfortran/io/io.h b/libgfortran/io/io.h index 9caf59f..e7b0ac1 100644 --- a/libgfortran/io/io.h +++ b/libgfortran/io/io.h @@ -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; diff --git a/libgfortran/io/read.c b/libgfortran/io/read.c index 5f88a39..e1e61ee 100644 --- a/libgfortran/io/read.c +++ b/libgfortran/io/read.c @@ -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; + } diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c index 84d3532..b2d26ac 100644 --- a/libgfortran/io/transfer.c +++ b/libgfortran/io/transfer.c @@ -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 (;;) { -- cgit v1.1