aboutsummaryrefslogtreecommitdiff
path: root/libgfortran
diff options
context:
space:
mode:
authorJerry DeLisle <jvdelisle@gcc.gnu.org>2005-12-09 02:53:41 +0000
committerJerry DeLisle <jvdelisle@gcc.gnu.org>2005-12-09 02:53:41 +0000
commit3993f4fb3d9b8374f480bd59fd353930fcf2bba3 (patch)
tree5889deeb49a6f23a2237c4405b7a024084c89977 /libgfortran
parenta31a55cd9744bf228efda85e3f73cadbe2d299b8 (diff)
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. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@108271 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libgfortran')
-rw-r--r--libgfortran/ChangeLog11
-rw-r--r--libgfortran/io/io.h6
-rw-r--r--libgfortran/io/read.c5
-rw-r--r--libgfortran/io/transfer.c15
4 files changed, 36 insertions, 1 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index 0fee7984bd4..1810d224bfa 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -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.
diff --git a/libgfortran/io/io.h b/libgfortran/io/io.h
index 9caf59fbd3e..e7b0ac18d1e 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 5f88a398f05..e1e61ee30da 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 84d3532deac..b2d26ac7be8 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 (;;)
{